2013-08-22 31 views
9

Tôi cần mở tệp từ một thư mục khác mà không cần sử dụng đường dẫn trong khi lưu trong thư mục hiện tại.Mở tất cả các tệp trong python thư mục khác nhau

Khi tôi thực thi mã bên dưới:

for file in os.listdir(sub_dir): 
    f = open(file, "r") 
    lines = f.readlines() 
    for line in lines: 
     line.replace("dst=", ", ") 
     line.replace("proto=", ", ") 
     line.replace("dpt=", ", ") 

Tôi nhận được thông báo lỗi FileNotFoundError: [Errno 2] No such file or directory: vì nó trong một thư mục phụ.

Câu hỏi: Có lệnh os nào tôi có thể sử dụng để định vị và mở tệp trong sub_dir không?

Cảm ơn! -cho tôi biết nếu đây là một lặp lại, tôi tìm kiếm và không thể tìm thấy một nhưng có thể đã bỏ lỡ nó.

+0

bạn cần phải thêm đường dẫn sub_dir đến tập tin của bạn trong() chức năng mở để có thể mở nó. –

Trả lời

11

os.listdir() liệt kê chỉ tên tệp không có đường dẫn. Thêm vào trước những việc này với sub_dir một lần nữa:

for filename in os.listdir(sub_dir): 
    f = open(os.path.join(sub_dir, filename), "r") 

Nếu tất cả các bạn đang làm là lặp trên các dòng từ tập tin, chỉ cần vòng qua các tập tin riêng của mình; sử dụng with đảm bảo rằng tệp được đóng cho bạn khi hoàn tất. Cuối cùng nhưng không kém, str.replace()lợi nhuận chuỗi giá trị mới, không thay đổi giá trị bản thân, vì vậy bạn cần lưu trữ mà giá trị trả về:

for filename in os.listdir(sub_dir): 
    with open(os.path.join(sub_dir, filename), "r") as f: 
     for line in f: 
      line = line.replace("dst=", ", ") 
      line = line.replace("proto=", ", ") 
      line = line.replace("dpt=", ", ") 
+0

Nếu tôi muốn viết dòng mới vào 'filename', tôi có thêm' f.write (line) 'và mở trong chế độ' a' không? – hjames

+0

@hjames: Chắc chắn, chỉ cần điều chỉnh tham số 'mode' của lệnh' open() '. –

+0

Hmm, nếu tôi đặt nó ở chế độ 'a' hoặc' w', nó sẽ trả về lỗi mà tệp không thể đọc được. Nếu tôi đặt nó ở chế độ 'r' thì rõ ràng là nó không thể ghi vào tập tin. – hjames

10

Bạn phải cung cấp đường dẫn đầy đủ nếu các tập tin không nằm trong hiện tại thư mục:

f = open(os.path.join(sub_dir, file)) 

tôi sẽ không sử dụng file như một tên biến, có lẽ filename, kể từ này được sử dụng để tạo ra một đối tượng tập tin trong Python.

-1

Mã để sao chép các file sử dụng shutil

import shutil 
import os 

source_dir = "D:\\StackOverFlow\\datasets" 
dest_dir = "D:\\StackOverFlow\\test_datasets" 
files = os.listdir("D:\\StackOverFlow\\datasets") 

if not os.path.exists(dest_dir): 
    os.makedirs(dest_dir) 

for filename in files: 
    if file.endswith(".txt"): 
     shutil.copy(os.path.join(source_dir, filename), dest_dir) 

print os.listdir(dest_dir) 
Các vấn đề liên quan