Saya perlu mengulang melalui subdirektori dari direktori yang diberikan dan mencari file. Jika saya mendapatkan file saya harus membukanya dan mengubah konten dan menggantinya dengan baris saya sendiri.
Saya mencoba ini:
import os
rootdir ='C:/Users/sid/Desktop/test'
for subdir, dirs, files in os.walk(rootdir):
for file in files:
f=open(file,'r')
lines=f.readlines()
f.close()
f=open(file,'w')
for line in lines:
newline = "No you are not"
f.write(newline)
f.close()
tapi saya mendapatkan kesalahan. Apa yang saya lakukan salah?
Jawaban:
Berjalan aktual melalui direktori berfungsi seperti yang Anda lakukan. Jika Anda mengganti konten loop dalam dengan
print
pernyataan sederhana, Anda dapat melihat bahwa setiap file ditemukan:Jika Anda masih mendapatkan kesalahan saat menjalankan di atas, berikan pesan kesalahan.
Diperbarui untuk Python3
sumber
Cara lain untuk kembali semua file dalam subdirektori adalah dengan menggunakan satu
pathlib
modul , diperkenalkan di Python 3.4, yang menyediakan pendekatan berorientasi objek untuk penanganan jalur filesystem (Pathlib juga tersedia di Python 2.7 melalui modul pathlib2 pada PyPI ):Sejak Python 3.5,
glob
modul ini juga mendukung pencarian file rekursif:Itu
file_list
salah satu dari pendekatan di atas dapat diulangi tanpa perlu loop bersarang:sumber
pathlib
diri saya sendiri, terutama karena saya suka metode-sintaks berorientasi objek. Ada perbedaan lain, seperti pustaka jalur mengembalikan kelas jalur khusus daripada string, dan fungsi yang tersedia berbeda antara pustaka (misalnyaos.path.expanduser('~')
vsPath.home()
). Jelajahi dokumentasi dan lihat pendekatan mana yang Anda inginkan.**
dalam pola glob, Anda bisa menggunakanrglob
.Pada tahun 2020 ,
glob.iglob(path/**, recursive=True)
tampaknya solusi yang paling pythonic , yaitu:Keluaran:
Catatan:
1 - glob.iglob
2 - Jika rekursif adalah
True
, pola'**'
akan cocok dengan file apa pun dan nol atau lebihdirectories
dansubdirectories
.3 - Jika direktori berisi file yang dimulai dengan
.
mereka tidak akan dicocokkan secara default. Misalnya, pertimbangkan direktori yang berisicard.gif
dan.card.gif
:4 - Anda juga dapat menggunakan
rglob(pattern)
, yang sama dengan meneleponglob()
dengan**/
menambahkan di depan pola relatif yang diberikan.sumber