Piszę skrypt, aby przeanalizować wiele plików dziennika i zachować listę plików, które zostały przetworzone. Kiedy czytam listę plików do przetworzenia używam os.walk
i uzyskać nazwy podobne do następujących:Python - Czy mogę (lub powinienem) zmienić os.path.sep?
C:/Users/Python/Documents/Logs\ServerUI04\SystemOut_13.01.01_20.22.25.log
ten jest tworzony przez następujący kod:
filesToProcess.extend(os.path.join(root, filename) for filename in filenames if logFilePatternMatch.match(filename))
Wydaje się, że „root” wykorzystywane do przodu ukośniki jako separator (jestem w systemie Windows i znajduję to wygodniej), ale "filename" używa odwrotnych ukośników, więc kończę na niespójnej ścieżce do pliku, ponieważ zawiera mieszaninę ukośników naprzód i odwrotnie jako separatory.
Próbowałem ustawienie separatora z:
os.path.sep = "/"
i
os.sep = "/"
Przed .join ale wydaje się nie mieć wpływu. Zdaję sobie sprawę, że teoretycznie mogłem manipulować łańcuchem, ale dłuższy termin, jaki chciałbym, aby mój skrypt działał na Uniksie i Windowsie, wolałby, żeby był dynamiczny, jeśli to możliwe.
Czy brakuje mi czegoś?
Aktualizacja:
podstawie pomocnych odpowiedzi poniżej wygląda mój problem samemu sobie, dla wygody miałem ustawić początkową ścieżkę używaną jako root tak:
logFileFolder = ['C:/Users/Python/Documents/Logs']
Kiedy zmienił go do tego:
logFileFolder = ['C:\\Users\\Python\\Documents\\Logs']
Wszystko działa, a ścieżki wynikowych ścieżek wszystkich używają znaku "\" w całym tekście. Wygląda na to, że moje podejście było złe, ponieważ starałem się, aby Python zmieniał zachowanie, zamiast korygować to, co ustawiłem jako wartość.
Dziękujemy!
Pójdę w opałach i powiedzieć, że ustawienie 'os.sep' prawdopodobnie nie jest w porządku rozwiązanie. –
możliwy duplikat [Dlaczego nie os.path.join używać os.path.sep lub os.sep?] (Http://stackoverflow.com/questions/12086224/why-not-os-path-join-use-os -path-sep-or-os-sep) – BrenBarn
Jak wskazuje na to zduplikowane pytanie, 'os.path' działa poprzez zaimportowanie' posixpath' lub 'ntpath' w zależności od twojego systemu operacyjnego. Co ciekawe, w kodzie źródłowym tych modułów można zobaczyć, że separator ścieżek jest zakodowany jako literał łańcuchowy wewnątrz funkcji 'join', więc nie będzie można go zmienić bez napisania własnej funkcji' join'. – BrenBarn