Bagaimana cara menelusuri semua subdirektori dan membaca file secara rekursif?

Saya memiliki direktori root-ish yang berisi beberapa subdirektori, yang semuanya berisi file bernama data.txt. Apa yang ingin saya lakukan adalah menulis skrip yang mengambil direktori "root &", dan kemudian membaca semua subdirektori dan membaca setiap "data.txt &" di subdirektori, dan kemudian menulis hal-hal dari setiap file data.txt ke file output.

Berikut ini adalah cuplikan kode saya:

import os
import sys
rootdir = sys.argv[1]

with open('output.txt','w') as fout:
    for root, subFolders, files in os.walk(rootdir):
        for file in files:
            if (file == 'data.txt'):
                #print file
                with open(file,'r') as fin:
                    for lines in fin:
                        dosomething()

Bagian dosomething() saya - saya telah menguji dan mengkonfirmasi bahwa bagian itu berfungsi jika saya menjalankan bagian itu hanya untuk satu file. Saya juga telah mengkonfirmasi bahwa jika saya memerintahkannya untuk mencetak file (baris yang dikomentari), skrip akan mencetak 'data.txt'.

Saat ini jika saya menjalankannya Python memberi saya kesalahan ini:

File "recursive.py", line 11, in <module>
    with open(file,'r') as fin:
IOError: [Errno 2] No such file or directory: 'data.txt'

Saya tidak yakin mengapa ia tidak dapat menemukannya - lagipula, ia mencetak data.txt jika saya tidak meng-income baris 'print file'. Apa yang saya lakukan dengan salah?

Larutan

Anda perlu menggunakan path absolut, variabel file Anda hanyalah nama file lokal tanpa path direktori. Variabel root adalah path tersebut:

with open('output.txt','w') as fout:
    for root, subFolders, files in os.walk(rootdir):
        if 'data.txt' in files:
            with open(os.path.join(root, 'data.txt'), 'r') as fin:
                for lines in fin:
                    dosomething()
Komentar (2)
[os.path.join(dirpath, filename) for dirpath, dirnames, filenames in os.walk(rootdir) 
                                 for filename in filenames]

Pendekatan fungsional untuk mendapatkan pohon terlihat lebih pendek, lebih bersih dan lebih Pythonic.

Anda dapat membungkus os.path.join(dirpath, filename) ke dalam fungsi apa pun untuk memproses file yang Anda dapatkan atau menyimpan array path untuk diproses lebih lanjut

Komentar (0)