2011-08-25 33 views
10

Tôi phải đọc trong một tập tin, thay đổi một phần của văn bản ở đây và ở đó, và sau đó ghi ra cùng một tập tin.Đọc trong tập tin - thay đổi nội dung - ghi ra cùng một tập tin

Hiện nay tôi làm:

f = open(file) 
file_str = f.read() # read it in as a string, Not line by line 
f.close() 
# 
# do_actions_on_file_str 
# 
f = open(file, 'w') # to clear the file 
f.write(file_str) 
f.close() 

Nhưng tôi sẽ tưởng tượng rằng có một cách tiếp cận pythonic hơn giúp tạo ra kết quả tương tự.

Đề xuất?

Trả lời

16

Điều đó có vẻ đơn giản và rõ ràng rồi. Bất kỳ đề xuất phụ thuộc vào các tập tin lớn như thế nào. Nếu không thực sự lớn mà có vẻ tốt. Nếu thực sự lớn, bạn có thể xử lý theo khối.

Nhưng bạn có thể sử dụng trình quản lý ngữ cảnh để tránh đóng cửa rõ ràng.

with open(filename) as f: 
    file_str = f.read() 

# do stuff with file_str 

with open(filename, "w") as f: 
    f.write(file_str) 
+3

Tôi không chắc chắn rằng tôi thường đề nghị đọc ở chế độ văn bản và viết bằng nhị phân mặc dù tôi thường xuyên làm điều này (bao gồm cả ngày hôm qua) . –

+0

@dash Oh yea, tôi chỉ ném nó vào. Nó không thực sự tạo nên sự khác biệt nào trên nền tảng của tôi. ;-) – Keith

+0

yeah nhưng nó làm cho sự khác biệt với chuỗi unicode. –

4

Nếu bạn làm việc từng dòng bạn có thể sử dụng fileinput với chế độ inplace

import fileinput 

for line in fileinput.input(mifile, inplace=1): 
    print process(line) 

nếu bạn cần để xử lý tất cả các văn bản cùng một lúc, sau đó mã của bạn có thể được tối ưu hóa một chút bằng with rằng sẽ chăm sóc của bế mạc tệp:

with open(myfile) as f: 
    file_str = f.read() 
# 
do_actions_on_file_str 
# 
with open(myfile, 'w') as f: 
    f.write(file_str) 
+0

Tôi thực sự làm công cụ regex, vv toàn bộ tập tin. Tôi có thể thấy câu hỏi của tôi không phản ánh như thế nào, tôi sẽ cập nhật nó – pseudosudo

-3

nếu bạn cần để xử lý tất cả các văn bản cùng một lúc, sau đó mã của bạn có thể được tối ưu hóa một chút bằng với điều đó sẽ chăm sóc của đóng file:

with open(myfile) as f: 
    file_str = f.read() 
# 
do_actions_on_file_str 
# 
with open(myfile, 'w') as f: 
    f.write(file_str) 
+1

Điều này dường như đã được sao chép từ câu trả lời mà @joaquin đăng trong năm 2011. –

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