Saya ingin hanya dapat mendaftar direktori di dalam beberapa folder. Ini berarti saya tidak ingin nama file terdaftar, saya juga tidak ingin sub-folder tambahan.
Mari kita lihat apakah sebuah contoh membantu. Dalam direktori saat ini kami memiliki:
>>> os.listdir(os.getcwd())
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'mod_p
ython-wininst.log', 'NEWS.txt', 'pymssql-wininst.log', 'python.exe', 'pythonw.ex
e', 'README.txt', 'Removemod_python.exe', 'Removepymssql.exe', 'Scripts', 'tcl',
'Tools', 'w9xpopen.exe']
Namun, saya tidak ingin nama file terdaftar. Saya juga tidak ingin sub-folder seperti \ Lib \ curses. Pada dasarnya apa yang saya inginkan berfungsi dengan yang berikut:
>>> for root, dirnames, filenames in os.walk('.'):
... print dirnames
... break
...
['cx_Oracle-doc', 'DLLs', 'Doc', 'include', 'Lib', 'libs', 'Scripts', 'tcl', 'Tools']
Namun, saya bertanya-tanya apakah ada cara yang lebih sederhana untuk mencapai hasil yang sama. Saya mendapat kesan bahwa menggunakan os.walk hanya untuk mengembalikan level atas tidak efisien / terlalu banyak.
python
filesystems
fuentesjr
sumber
sumber
os.walk
Gunakan
os.walk
dengannext
fungsi item:Untuk Python <= 2,5 gunakan:
Bagaimana ini bekerja?
os.walk
adalah generator dan panggilannext
akan mendapatkan hasil pertama dalam bentuk 3-tuple (dirpath, dirnames, nama file). Dengan demikian[1]
indeks hanya mengembalikandirnames
dari tuple itu.sumber
DIRNAMES=1
dan kemudiannext()[DIRNAMES]
membuatnya lebih mudah untuk dipahami oleh pengelola kode di masa depan.os.walk( os.path.join(mypath,'.')).next()[1]
sorted( [os.path.join(os.getcwd(), item) for item in os.walk(os.curdir).next()[1]] )
Saring daftar menggunakan os.path.isdir untuk mendeteksi direktori.
sumber
os.listdir
mengembalikan nama file / folder, diteruskan keos.path.isdir
, tetapi yang terakhir membutuhkan path lengkap.timeit(os.walk(os.getcwd()).next()[1])
1000 loops, best of 3: 734 µs per loop
timeit(filter(os.path.isdir, os.listdir(os.getcwd())))
1000 loops, best of 3: 477 µs per loop
sumber
Perhatikan bahwa, alih-alih melakukan
os.listdir(os.getcwd())
, itu lebih baik dilakukanos.listdir(os.path.curdir)
. Satu panggilan fungsi kurang, dan itu sebagai portabel.Jadi, untuk melengkapi jawabannya, untuk mendapatkan daftar direktori di folder:
Jika Anda lebih suka nama path lengkap, gunakan fungsi ini:
sumber
Ini sepertinya berfungsi juga (setidaknya di linux):
sumber
glob
. Ini dapat menghemat banyak kode, terutama iterasi, dan sangat mirip dengan penggunaan terminal UNIX (ls
)Hanya untuk menambahkan bahwa menggunakan os.listdir () tidak "mengambil banyak pemrosesan vs os.walk sangat sederhana (). Next () [1]" . Ini karena os.walk () menggunakan os.listdir () secara internal. Bahkan jika Anda mengujinya bersama:
Pemfilteran os.listdir () sangat sedikit lebih cepat.
sumber
scandir
paket - tersedia untuk Python 2.6 dan seterusnya sebagai paket yang dapat diinstal di PyPI. Menawarkan penggantian untukos.walk
danos.listdir
yang jauh lebih cepat.Cara yang sangat sederhana dan elegan adalah dengan menggunakan ini:
Jalankan skrip ini di folder yang sama yang Anda inginkan nama folder. Ini akan memberi Anda persis nama folder langsung saja (itu juga tanpa path lengkap folder).
sumber
Menggunakan pemahaman daftar,
Saya pikir ini adalah cara paling sederhana
sumber
menjadi pemula di sini saya belum bisa berkomentar secara langsung tetapi di sini ada koreksi kecil saya ingin menambahkan ke bagian berikut dari jawaban ΤΖΩΤΖΙΟΥ :
bagi yang masih menggunakan python <2.4 : konstruk dalam perlu daftar bukan tupel dan karena itu harus membaca seperti ini:
jika tidak, orang akan mendapatkan kesalahan sintaksis.
sumber
sumber
Untuk daftar nama jalur lengkap, saya lebih suka versi ini daripada solusi lain di sini:
sumber
sumber
Opsi yang lebih aman yang tidak gagal saat tidak ada direktori.
sumber
Seperti begitu?
sumber
Python 3.4 diperkenalkan pada
pathlib
modul ke dalam perpustakaan standar, yang menyediakan pendekatan berorientasi objek untuk jalur menangani filesystem:sumber
sumber