2010-11-06 39 views
9

Tôi muốn lưu đầu ra (contents) vào một tệp (lưu nó trong UTF-8). Tệp không được ghi đè, tệp sẽ được lưu dưới dạng tệp mới - ví dụ: file2.txt Vì vậy, tôi mở một số file.txt, mã hóa nó bằng UTF-8, thực hiện một số nội dung và sau đó muốn lưu nó vào file2.txt trong UTF-8. Làm thế nào để tôi làm điều này?Ghi vào một tập tin .txt (UTF-8), trăn

import codecs 
def openfile(filename): 
    with codecs.open(filename, encoding="UTF-8") as F: 
     contents = F.read() 
     ... 
+0

"Tệp không được ghi đè". Tại sao chỉ có một mở nếu bạn đang đọc một tập tin và viết một tập tin mới? –

+0

vì đây là mã chưa hoàn thành. ... – Gusto

+0

"vì đây là mã chưa hoàn thành"? Gì? "chưa hoàn thành" không phải là một lời giải thích tốt cho sự không phù hợp giữa yêu cầu của bạn và mã của bạn. Tại sao chỉ có một mở? Vui lòng sửa mã của bạn để phù hợp với yêu cầu của bạn tốt hơn một chút. –

Trả lời

16

Cách ngắn:

file('file2.txt','w').write(file('file.txt').read().encode('utf-8')) 

Các chặng đường dài:

data = file('file.txt').read() 
... process data ... 
data = data.encode('utf-8') 
file('file2.txt','w').write(data) 

Và sử dụng 'codec' một cách rõ ràng:

codecs.getwriter('utf-8')(file('/tmp/bla3','w')).write(data) 
+0

tệp 'file2.txt' khi mở trong notepad không phải là mã hóa utf-8, có thể do tôi đã giải mã dữ liệu bằng codec (nhập codec) và khi lưu tệp vào tệp, hãy sử dụng cách khác như bạn đã đề xuất (sử dụng mã hóa phương pháp). Câu hỏi đặt ra là làm thế nào để mã hóa nó bằng cách sử dụng codec? – Gusto

+0

@Gusto - Tôi đã thêm một phương thức riêng biệt, mặc dù nó hoàn toàn tương đương. Làm thế nào bạn có thể thấy trong notepad rằng một tập tin không phải là utf-8 được mã hóa? notepad thực sự giải mã cho bạn. – adamk

+0

Tôi có thể thấy nó vì các ký tự Cyrillic không được hiển thị đúng cách, tôi phải giải mã bằng tay bằng bộ mã hóa notepad. P.S. Sử dụng Notepad ++ – Gusto

9

Tôi muốn tách biệt các mối quan tâm trong các tình huống như thế này - tôi nghĩ nó thực sự làm cho mã sạch hơn, dễ bảo trì hơn và có thể hiệu quả hơn.

Ở đây bạn có 3 mối quan tâm: đọc tệp UTF-8, xử lý các dòng và viết tệp UTF-8. Giả sử xử lý của bạn là dựa trên dòng, điều này hoạt động hoàn hảo trong Python, vì việc mở và lặp qua các dòng của một tệp được tích hợp vào ngôn ngữ. Cũng như rõ ràng hơn, điều này cũng hiệu quả hơn vì nó cho phép bạn xử lý các tệp lớn không vừa với bộ nhớ. Cuối cùng, nó cung cấp cho bạn một cách tuyệt vời để kiểm tra mã của bạn - bởi vì việc xử lý được tách biệt với tệp io, cho phép bạn viết các bài kiểm tra đơn vị, hoặc thậm chí chỉ chạy mã xử lý trên văn bản ví dụ và xem lại thủ công mà không gặp khó khăn với các tệp.

Tôi đang chuyển đổi các dòng thành chữ hoa cho các mục đích ví dụ - có lẽ quá trình xử lý của bạn sẽ thú vị hơn. Tôi thích sử dụng năng suất ở đây - nó làm cho nó dễ dàng cho việc xử lý để loại bỏ hoặc chèn thêm dòng mặc dù đó là không được sử dụng trong ví dụ tầm thường của tôi.

def process(lines): 
    for line in lines: 
     yield line.upper() 

with codecs.open(file1, 'r', 'utf-8') as infile: 
    with codecs.open(file2, 'w', 'utf-8') as outfile: 
     for line in process(infile): 
      outfile.write(line) 
Các vấn đề liên quan