Mój skrypt w Pythonie wykonuje operację, w os.listdir(path)
której ścieżka jest kolejką zawierającą archiwa, które muszę pojedynczo traktować.
Problem polega na tym, że otrzymuję listę w tablicy, a następnie po prostu robię proste array.pop(0)
. Działało dobrze, dopóki nie umieściłem projektu w wywrotce. Teraz mam .svn
folder w mojej tablicy i oczywiście powoduje to awarię mojej aplikacji.
Oto moje pytanie: czy istnieje funkcja, która ignoruje ukryte pliki podczas wykonywania, os.listdir()
a jeśli nie, to jaki byłby najlepszy sposób?
python
hidden-files
talnicolas
źródło
źródło
os.path.isdir()
Odpowiedzi:
Możesz sam napisać:
def listdir_nohidden(path): for f in os.listdir(path): if not f.startswith('.'): yield f
Lub możesz użyć globu :
def listdir_nohidden(path): return glob.glob(os.path.join(path, '*'))
Każde z nich zignoruje wszystkie nazwy plików zaczynające się od
'.'
.źródło
listdir_nohidden
nie jest do końca kompatybilnaos.listdir
, ponieważ użycieyield
powoduje, że jest ona generatorem. Zamiast tego powinien przeglądać listę wynikówos.listdir
i usuwać wpisy zaczynające się od „.”list(listdir_nohidden(path))
i ta nowa funkcja jest dokładnie zgodna zos.listdir
.To jest stare pytanie, ale wygląda na to, że brakuje w nim oczywistej odpowiedzi na temat używania funkcji rozumienia list, więc dodam je tutaj dla kompletności:
[f for f in os.listdir(path) if not f.startswith('.')]
Na marginesie, stan docs
listdir
zwróci wyniki w „dowolnej kolejności”, ale częstym przypadkiem użycia jest sortowanie alfabetyczne. Jeśli chcesz, aby zawartość katalogu była posortowana alfabetycznie bez użycia wielkich liter, możesz użyć:sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
źródło
key=lambda f: f.lower()
można zapisać bez lambdy:key=str.lower
sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.lower)
W systemach Windows, Linux i OS X:
if os.name == 'nt': import win32api, win32con def folder_is_hidden(p): if os.name== 'nt': attribute = win32api.GetFileAttributes(p) return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM) else: return p.startswith('.') #linux-osx
źródło
[f for f in os.listdir(path) if not folder_is_hidden(f)]
Joshmaker ma właściwe rozwiązanie na Twoje pytanie.
Jak zignorować ukryte pliki za pomocą os.listdir ()?
Jednak w Pythonie 3 zaleca się używanie pathlib zamiast os.
from pathlib import Path visible_files = [ file for file in Path(".").iterdir() if not file.name.startswith(".") ]
źródło
glob :
>>> import glob >>> glob.glob('*')
(
glob
twierdzi, że używalistdir
ifnmatch
pod maską, ale sprawdza również prowadzenie'.'
, a nie za pomocąfnmatch
.)źródło
Myślę, że przeglądanie wszystkich elementów w pętli wymaga zbyt wiele pracy. Wolałbym coś prostszego:
lst = os.listdir(path) if '.DS_Store' in lst: lst.remove('.DS_Store')
Jeśli katalog zawiera więcej niż jeden ukryty plik , może to pomóc:
all_files = os.popen('ls -1').read() lst = all_files.split('\n')
dla niezależności platformy, jak wspomniał @Josh, glob działa dobrze:
import glob glob.glob('*')
źródło
.DS_Store
są tworzone automatycznie. Kiedy spakuję wszystkie pliki i wypchnę je na serwer,.DS_Store
również zostaną dodane. Jeśli istnieją różne ukryte pliki, możesz spróbowaćos.system('ls -1')
os.popen('ls -1').read()
nie będzie działać w systemie Windows. O to właśnie chodzios.listdir()
.filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
źródło