Bagaimana saya bisa mendaftar konten direktori dengan Python?

188

Tidak mungkin sulit, tetapi saya mengalami gangguan mental.

Paul D. Waite
sumber

Jawaban:

262
import os
os.listdir("path") # returns list
pengguna85461
sumber
52

Satu arah:

import os
os.listdir("/home/username/www/")

Cara lain :

glob.glob("/home/username/www/*")

Contoh ditemukan di sini .

The glob.globmetode di atas tidak akan daftar file yang tersembunyi.

Karena saya awalnya menjawab pertanyaan ini bertahun-tahun yang lalu, pathlib telah ditambahkan ke Python. Cara yang saya sukai untuk mendaftar direktori sekarang biasanya melibatkan iterdirmetode pada Pathobjek:

from pathlib import Path
print(*Path("/home/username/www/").iterdir(), sep="\n")
Trey Hunner
sumber
Akankah glob.glob mendaftarkan file-file yang disembunyikan (saya berasumsi maksud Anda .XYZfile dalam konteks sistem file Unix), bila digunakan glob.glob("/home/username/www/.*")?
Andy Finkenstadt
Ya maksud saya file dimulai dengan titik. Contoh yang Anda berikan akan berfungsi untuk mencocokkan file yang tersembunyi (dan hanya file yang tersembunyi).
Trey Hunner
Saya baru saja mengimpor glob dan menggunakan glob.glob (r'c: \ users ') tetapi hanya dikembalikan['c:\\users']
Musixauce3000
1
@ Musixauce3000: Anda ingin melakukannya glob.glob(r'c:\users\*')(glob tidak benar-benar mendaftar direktori, tetapi memperluas tanda bintang dan semacamnya yang menyelesaikan tugas serupa).
Trey Hunner
38

os.walk dapat digunakan jika Anda membutuhkan rekursi:

import os
start_path = '.' # current directory
for path,dirs,files in os.walk(start_path):
    for filename in files:
        print os.path.join(path,filename)
Mark Tolonen
sumber
18

glob.globatau os.listdirakan melakukannya.

Tuomas Pelkonen
sumber
import globENTER glob.glob(r'c:\users')ENTER sepertinya hanya kembali ['c:\\users']. Mengapa demikian? Saya ingin menggunakan glob.glob karena seperti yang ditunjukkan oleh pengguna lain, itu seharusnya mengembalikan isi direktori sementara juga mengabaikan file tersembunyi. Ini penting.
Musixauce3000
karena Anda harus menentukan wildcard dengan glob:glob.glob(r'c:\users\*')
Jean-François Fabre
14

The osmodul menangani semua itu.

os.listdir(path)

Kembali daftar yang berisi nama-nama entri dalam direktori yang diberikan oleh path. Daftar ini dalam urutan acak. Itu tidak termasuk entri khusus '.' dan '..' bahkan jika mereka ada di direktori.

Ketersediaan: Unix, Windows.

zdav
sumber
4

Di Python 3.4+, Anda dapat menggunakan pathlibpaket baru :

from pathlib import Path
for path in Path('.').iterdir():
    print(path)

Path.iterdir()mengembalikan iterator, yang dapat dengan mudah diubah menjadi list:

contents = list(Path('.').iterdir())
jpyams
sumber
3

Sejak Python 3.5, Anda dapat menggunakan os.scandir.

Perbedaannya adalah ia mengembalikan entri file bukan nama. Pada beberapa OS seperti windows, itu berarti Anda tidak perlu os.path.isdir/filetahu apakah itu file atau tidak, dan itu menghemat waktu CPU karena statsudah dilakukan saat memindai dir di Windows:

contoh untuk mendaftar direktori dan mencetak file lebih besar dari max_valuebyte:

for dentry in os.scandir("/path/to/dir"):
    if dentry.stat().st_size > max_value:
       print("{} is biiiig".format(dentry.name))

(baca jawaban saya berdasarkan kinerja yang luas di sini )

Jean-François Fabre
sumber
2

Kode di bawah ini akan mencantumkan direktori dan file dalam direktori. Yang lainnya adalah os.walk

def print_directory_contents(sPath):
        import os                                       
        for sChild in os.listdir(sPath):                
            sChildPath = os.path.join(sPath,sChild)
            if os.path.isdir(sChildPath):
                print_directory_contents(sChildPath)
            else:
                print(sChildPath)
Heenashree Khandelwal
sumber