Skrip python saya mengeksekusi di os.listdir(path)
mana jalurnya adalah antrian yang berisi arsip yang perlu saya tangani satu per satu.
Masalahnya adalah saya mendapatkan daftar dalam array dan kemudian saya hanya melakukan yang sederhana array.pop(0)
. Itu bekerja dengan baik sampai saya menempatkan proyek dalam subversi. Sekarang saya mendapatkan .svn
folder tersebut di array saya dan tentu saja itu membuat aplikasi saya macet.
Jadi, inilah pertanyaan saya: apakah ada fungsi yang mengabaikan file tersembunyi saat menjalankan os.listdir()
dan jika tidak, apa cara terbaik?
python
hidden-files
talnicolas
sumber
sumber
os.path.isdir()
Jawaban:
Anda dapat menulisnya sendiri:
def listdir_nohidden(path): for f in os.listdir(path): if not f.startswith('.'): yield f
Atau Anda dapat menggunakan glob :
def listdir_nohidden(path): return glob.glob(os.path.join(path, '*'))
Salah satu dari ini akan mengabaikan semua nama file yang dimulai dengan
'.'
.sumber
listdir_nohidden
tidak cukup kompatibelos.listdir
, karena penggunaanyield
menjadikannya sebagai generator. Sebaliknya itu harus dijalankan melalui daftar keluaran darios.listdir
dan menghapus entri yang dimulai dengan '.'list(listdir_nohidden(path))
dan fungsi baru tersebut benar-benar kompatibelos.listdir
.Ini adalah pertanyaan lama, tetapi sepertinya tidak ada jawaban yang jelas untuk menggunakan pemahaman daftar, jadi saya menambahkannya di sini untuk kelengkapan:
[f for f in os.listdir(path) if not f.startswith('.')]
Sebagai catatan tambahan, status dokumen
listdir
akan mengembalikan hasil dalam 'urutan arbitrer' tetapi kasus penggunaan yang umum adalah meminta mereka diurutkan menurut abjad. Jika Anda ingin isi direktori diurutkan menurut abjad tanpa menggunakan huruf besar, Anda dapat menggunakan:sorted([f for f in os.listdir('./')], key=lambda f: f.lower())
sumber
key=lambda f: f.lower()
dapat ditulis tanpa lambda:key=str.lower
sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.lower)
Di Windows, Linux, dan 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
sumber
[f for f in os.listdir(path) if not folder_is_hidden(f)]
Joshmaker memiliki solusi yang tepat untuk pertanyaan Anda.
Bagaimana cara mengabaikan file tersembunyi menggunakan os.listdir ()?
Namun dalam Python 3, disarankan untuk menggunakan pathlib daripada os.
from pathlib import Path visible_files = [ file for file in Path(".").iterdir() if not file.name.startswith(".") ]
sumber
glob :
>>> import glob >>> glob.glob('*')
(
glob
mengklaim menggunakanlistdir
dan difnmatch
bawah kap, tetapi juga memeriksa petunjuk'.'
, bukan dengan menggunakanfnmatch
.)sumber
Saya pikir itu terlalu banyak pekerjaan untuk melewati semua item dalam satu lingkaran. Saya lebih suka sesuatu yang lebih sederhana seperti ini:
lst = os.listdir(path) if '.DS_Store' in lst: lst.remove('.DS_Store')
Jika direktori berisi lebih dari satu file tersembunyi , ini dapat membantu:
all_files = os.popen('ls -1').read() lst = all_files.split('\n')
untuk kemandirian platform seperti yang disebutkan @Josh, glob berfungsi dengan baik:
import glob glob.glob('*')
sumber
.DS_Store
dibuat secara otomatis. Ketika saya membuat zip semua file dan mendorongnya ke server.DS_Store
juga akan ditambahkan. Jika ada berbagai file tersembunyi maka Anda dapat mencobaos.system('ls -1')
os.popen('ls -1').read()
tidak akan berfungsi di Windows. Itulah inti darios.listdir()
.filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
sumber