2012-11-26 45 views
31

Tôi có thư mục gốc-ish chứa nhiều thư mục con, tất cả đều chứa tên tệp data.txt. Những gì tôi muốn làm là viết một kịch bản mà có trong thư mục "root", và sau đó đọc qua tất cả các thư mục con và đọc mỗi "data.txt" trong thư mục con, và sau đó viết công cụ từ mọi tập tin data.txt để một tập tin đầu ra.Làm thế nào để đệ quy đi qua tất cả các thư mục con và đọc tệp?

Dưới đây là một đoạn mã của tôi:

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() 

DoSomething của tôi() phần - Tôi đã thử nghiệm và xác nhận cho nó để làm việc nếu tôi chạy phần đó chỉ dành riêng cho một tập tin. Tôi cũng đã xác nhận rằng nếu tôi yêu cầu nó in tập tin thay vào đó (dòng nhận xét ra) kịch bản in ra 'data.txt'.

Ngay bây giờ nếu tôi chạy nó Python mang lại cho tôi lỗi này:

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

Tôi không chắc chắn lý do tại sao nó không thể tìm thấy nó - sau khi tất cả, nó in ra data.txt nếu tôi bỏ ghi chú dòng 'tệp in'. Tôi đang làm gì sai?

+1

Chỉ cần một lời nhận xét phong cách: một lần làm tổ được sâu này, nó có thể khó đọc. Để đơn giản hóa, tôi sẽ đặt phần bên trong trong một hàm 'def do_file (filename): ...' riêng biệt. Bạn cũng có thể làm 'if file == 'data.txt': tiếp tục' để đơn giản hóa và lưu một cấp ở đó. Xem thêm [PEP 20] (http://www.python.org/dev/peps/pep-0020/): "Phẳng tốt hơn lồng nhau". –

Trả lời

50

Bạn cần sử dụng đường dẫn tuyệt đối, biến số file của bạn chỉ là tên tệp cục bộ không có đường dẫn thư mục. Biến root là con đường mà:

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() 
+0

Điều đó hoạt động hoàn hảo. Cảm ơn! – Joe

+7

Nếu, như tôi, bất cứ ai đọc điều này muốn lọc thêm các tên tập tin được lặp lại, câu trả lời cho câu hỏi này tỏ ra rất hữu ích: http://stackoverflow.com/questions/2186525/use-a-glob-to-find-files -recursively-in-python – BigglesZX

+2

['os.walk()' + follow symlinks] (http://stackoverflow.com/questions/3771696/python-os-walk-follow-symlinks) giải quyết cách liên kết này theo sau. – Schorsch

0
[os.path.join(dirpath, filename) for dirpath, dirnames, filenames in os.walk(rootdir) 
           for filename in filenames] 

Một cách tiếp cận chức năng để có được những cây trông ngắn hơn, sạch hơn và nhiều hơn nữa Pythonic.

Bạn có thể quấn os.path.join(dirpath, filename) vào bất kỳ chức năng để xử lý các tập tin bạn nhận hoặc lưu mảng các đường dẫn để chế biến tiếp

Các vấn đề liên quan