Saya tahu bahwa kita dapat menggunakan os.walk()
daftar semua sub-direktori atau semua file dalam sebuah direktori. Namun, saya ingin membuat daftar isi pohon direktori lengkap:
- Subdirectory 1:
- file11
- file12
- Sub-sub-directory 11:
- file111
- file112
- Subdirectory 2:
- file21
- sub-sub-directory 21
- sub-sub-directory 22
- sub-sub-sub-directory 221
- file 2211
Bagaimana cara terbaik mencapai ini dengan Python?
ValueError: zero length field name in format
terlempar.root.replace(startpath, '', 1)
harus memperbaikinyaMirip dengan jawaban di atas, tetapi untuk python3, bisa dibilang bisa dibaca dan bisa dibilang bisa diperluas:
Contoh penggunaan:
Contoh keluaran:
Catatan
Edit:
sumber
Solusi tanpa lekukan Anda:
os.walk sudah melakukan penjelajahan top-down, kedalaman-pertama yang Anda cari.
Mengabaikan daftar dirs mencegah tumpang tindih yang Anda sebutkan.
sumber
NameError: name 'path' is not defined
Kami biasanya lebih suka menggunakan pohon GNU, tetapi kami tidak selalu memiliki
tree
pada setiap sistem, dan terkadang Python 3 tersedia. Jawaban yang baik di sini dapat dengan mudah disalin-tempel dan tidak menjadikan GNUtree
sebagai persyaratan.tree
Outputnya terlihat seperti ini:Saya membuat struktur direktori di atas di direktori home saya di bawah direktori yang saya sebut
pyscratch
.Saya juga melihat jawaban lain di sini yang mendekati keluaran semacam itu, tetapi saya pikir kita bisa melakukan lebih baik, dengan kode yang lebih sederhana, lebih modern dan pendekatan evaluasi malas.
Pohon dengan Python
Untuk memulai, mari gunakan contoh itu
Path
objekyield
danyield from
ekspresi (yang membuat fungsi generator)dan sekarang:
cetakan:
Kita memang perlu mewujudkan setiap direktori menjadi sebuah daftar karena kita perlu mengetahui berapa panjangnya, tetapi setelah itu kita membuang daftarnya. Untuk rekursi yang dalam dan luas, ini harus cukup malas.
Kode di atas, dengan komentar, seharusnya cukup untuk memahami sepenuhnya apa yang kita lakukan di sini, tetapi jangan ragu untuk melangkah melewatinya dengan debugger untuk lebih baik jika Anda perlu.
Lebih banyak fitur
Sekarang GNU
tree
memberi kita beberapa fitur berguna yang saya ingin miliki dengan fungsi ini:n directories, m files
-L level
-d
Juga, ketika ada pohon besar, akan berguna untuk membatasi iterasi (misalnya dengan
islice
) untuk menghindari penguncian interpreter Anda dengan teks, karena pada titik tertentu hasilnya menjadi terlalu bertele-tele untuk digunakan. Kita dapat membuat ini menjadi tinggi secara default - katakanlah1000
.Jadi mari kita hapus komentar sebelumnya dan isi fungsi ini:
Dan sekarang kita bisa mendapatkan jenis keluaran yang sama seperti
tree
:cetakan:
Dan kami dapat membatasi ke level:
cetakan:
Dan kita dapat membatasi output ke direktori:
cetakan:
Retrospektif
Dalam retrospeksi, kita bisa digunakan
path.glob
untuk pencocokan. Kita mungkin juga bisa menggunakanpath.rglob
untuk rekursif globbing, tapi itu akan membutuhkan penulisan ulang. Kita juga dapat menggunakanitertools.tee
alih-alih membuat daftar isi direktori, tetapi itu bisa memiliki pengorbanan negatif dan mungkin akan membuat kode menjadi lebih kompleks.Komentar dipersilakan!
sumber
elif not limit_to_directories:
menambahkan yang berikut ini:info = prefix + pointer + path.name; try: with path.open('r') as f: n_lines = len(f.readlines()); loc = f' LOC: {n_lines}'; info += loc; except UnicodeDecodeError: pass; yield info
Lihat tautan ini untuk ruang kosong yang tepat.contents
perlu disaring jikalimit_to_directories
Benar. Jika tidak, jika folder tidak memiliki direktori untuk file terakhir, pohon tidak akan digambar dengan benar.if limit_to_directories: contents = [path for path in contents if path.is_dir()]
list(dir_path.iterdir())
pengembalian pohon struktur direktori top-down yang disusun dengan benar. Saya tidak melihat jaminan seperti itu di API untuk iterdir () . Mohon berikan referensi tentang bagaimanaiterdir()
pemesanan atau jaminan memberikan pemesanan yang diinginkan.os.listdir()
secara default - yang tidak menjamin urutan : "Daftar ini dalam urutan sewenang-wenang, dan tidak menyertakan entri khusus '.' dan '..' meskipun mereka ada di direktori. "Saya datang ke sini mencari hal yang sama dan menggunakan jawaban dhobbs untuk saya. Sebagai cara untuk berterima kasih kepada komunitas, saya menambahkan beberapa argumen untuk ditulis ke file, seperti yang diminta akshay, dan membuat menampilkan file opsional sehingga tidak terlalu menjadi output. Juga jadikan indentasi sebagai argumen opsional sehingga Anda dapat mengubahnya, karena beberapa menyukainya menjadi 2 dan yang lain memilih 4.
Menggunakan loop yang berbeda sehingga yang tidak menampilkan file tidak memeriksa apakah itu harus pada setiap iterasi.
Semoga ini membantu orang lain karena jawaban dhobbs membantu saya. Terima kasih banyak.
sumber
Berdasarkan postingan fantastis ini
http://code.activestate.com/recipes/217212-treepy-graphically-displays-the-directory-structur/
Inilah perbaikan untuk berperilaku persis seperti
http://linux.die.net/man/1/tree
sumber
Jika ada yang tertarik - fungsi rekursif itu mengembalikan struktur kamus bersarang. Kunci adalah
file system
nama (direktori dan file), nilainya adalah:file_token
)String yang menunjuk file kosong dalam contoh ini. Mereka juga dapat diberi konten file atau info pemilik atau hak istimewa atau objek apa pun selain dict. Kecuali itu kamus, ini dapat dengan mudah dibedakan dari "jenis direktori" dalam operasi lebih lanjut.
Memiliki pohon seperti itu dalam sistem file:
Hasilnya adalah:
Jika Anda seperti itu, saya sudah membuat paket (python 2 & 3) dengan barang-barang ini (dan
pyfakefs
pembantu yang bagus ): https://pypi.org/project/fsforge/sumber
Di atas jawaban dhobbs di atas ( https://stackoverflow.com/a/9728478/624597 ), berikut adalah fungsi tambahan untuk menyimpan hasil ke file (saya pribadi menggunakannya untuk menyalin dan menempel ke FreeMind untuk mendapatkan gambaran umum yang bagus tentang strukturnya, oleh karena itu saya menggunakan tab, bukan spasi untuk lekukan):
sumber
Anda dapat menjalankan perintah 'pohon' dari shell Linux.
Instalasi:
Menggunakan dalam python
Contoh:
Ini memberi Anda struktur yang lebih bersih dan secara visual lebih komprehensif dan mudah untuk mengetik.
sumber
Solusi ini hanya akan berfungsi jika Anda telah
tree
menginstal di sistem Anda. Namun saya meninggalkan solusi ini di sini kalau-kalau itu membantu orang lain.Anda bisa memberi tahu pohon untuk mengeluarkan struktur pohon sebagai XML (
tree -X
) atau JSON (tree -J
). JSON tentu saja dapat diurai langsung dengan python dan XML dengan mudah dapat dibacalxml
.Dengan struktur direktori berikut sebagai contoh:
XML
JSON
sumber
Mungkin lebih cepat dari @ellockie (Mungkin)
Hasil tes pada screenshot di bawah ini:
sumber
Di sini Anda dapat menemukan kode dengan keluaran seperti ini: https://stackoverflow.com/a/56622847/6671330
sumber
Bagi mereka yang masih mencari jawaban. Berikut adalah pendekatan rekursif untuk mendapatkan jalur dalam kamus.
sumber
Jawaban @ dhobbs luar biasa!
tetapi cukup ubah agar mudah mendapatkan info level
dan hasilnya seperti
Anda bisa mendapatkan level dengan
|
hitungan!sumber