2012-04-29 39 views
5

Tôi đang sử dụng python 2.7. Tôi đã thử nhiều thứ như codec nhưng không hoạt động. Làm thế nào tôi có thể sửa lỗi này.Đọc các ký tự không phải ASCII từ một tệp văn bản

myfile.txt

wörd 

Mã của tôi

f = open('myfile.txt','r') 
for line in f: 
    print line 
f.close() 

Output

s\xc3\xb6zc\xc3\xbck 

Output là như nhau trên nhật thực và cửa sổ lệnh. Tôi đang sử dụng Win7. Không có vấn đề với bất kỳ ký tự nào khi tôi không đọc từ một tệp.

+3

kết quả gì là bạn mong đợi? Về mặt kỹ thuật, python đã đọc tệp một cách chính xác. – srgerg

+0

Tại sao bạn in ra ký tự dòng theo ký tự? Tại sao không chỉ đơn giản nói 'cho dòng trong f: dòng in'? Khi tôi làm điều đó, nó in "söcük" như mong muốn. – srgerg

+0

Tôi đã thử nhưng không hoạt động. Nó in s \ xc3 \ xb6zc \ xc3 \ xbck. – Rckt

Trả lời

7
  1. trước hết - phát hiện mã hóa

    from chardet import detect 
    encoding = lambda x: detect(x)['encoding'] 
    print encoding(line) 
  1. sau đó - chuyển đổi nó unicode hoặc mã hóa mặc định của bạn str:

    n_line=unicode(line,encoding(line),errors='ignore') 
    print n_line 
    print n_line.encode('utf8') 
1

Đó là mã hóa thiết bị đầu cuối. Hãy thử để cấu hình thiết bị đầu cuối của bạn với cùng một mã hóa bạn đang sử dụng trong tập tin của bạn. Tôi khuyên bạn nên sử dụng UTF-8.

Bằng cách này, là một thực hành tốt để giải mã mã hóa tất cả các bạn đóng góp-đầu ra để tránh các vấn đề:

f = open('test.txt','r')  
for line in f: 
    l = unicode(line, encoding='utf-8')# decode the input                     
    print l.encode('utf-8') # encode the output                        
f.close() 
+0

Bây giờ tôi thấy lý do tại sao họ đang làm tiêu chuẩn UTF-8 trong 3.0. (PEP 3120) – mgold

+2

@mgold: PEP 3120 là tất cả về mã hóa tệp nguồn (.py); nó không liên quan gì đến vấn đề của OP với mã hóa đầu vào và/hoặc đầu ra. –

+0

Ooh. Nắm bắt tốt. – mgold

7
import codecs 
#open it with utf-8 encoding 
f=codecs.open("myfile.txt","r",encoding='utf-8') 
#read the file to unicode string 
sfile=f.read() 

#check the encoding type 
print type(file) #it's unicode 

#unicode should be encoded to standard string to display it properly 
print sfile.encode('utf-8') 
#check the type of encoded string 

print type(sfile.encode('utf-8')) 
Các vấn đề liên quan