2016-11-24 13 views
7

Tôi đang đọc dữ liệu từ một tệp có chứa các từ có chữ cái tiếng Pháp và tiếng Anh. Tôi đang cố gắng xây dựng một danh sách tất cả các chữ cái tiếng Anh và tiếng Pháp có thể (được lưu trữ dưới dạng chuỗi). Tôi làm điều này với các mã bên dưới:Xử lý các chữ cái tiếng Pháp trong Python

# encoding: utf-8 
def trackLetter(letters, line): 
    for a in line: 
     found = False; 
     for b in letters: 
      if b==a: 
       found = True 
     if not found: 
      letters += a 

cur_letters = []; # for storing possible letters 

data = urllib2.urlopen('https://duolinguist.wordpress.com/2015/01/06/top-5000-words-in-french-wordlist/', 'utf-8') 
for line in data: 
    trackLetter(cur_letters, line) 
    # works if I print here 

print cur_letters 

Mã này in như sau:

[ 't', 'h', 'e', ​​'o', 'f', 'một ',' n ',' d ',' i ',' r ',' s ',' b ',' y ',' w ', ' u ',' m ',' l ',' v ' , 'c', 'p', 'g', 'k', 'x', 'j', 'z', 'q', '\ xc3', '\ xa0', '\ xaa', ' \ xb9 ',' \ xa9 ',' \ xa8 ',' \ xb4 ',' \ xae ',' - ',' \ xe2 ', ' \ x80 ',' \ x99 ',' \ xa2 ',' \ xa7 ',' \ xbb ',' \ xaf ']

Rõ ràng là F chữ cái rench đã bị mất trong một số loại chuyển đổi sang ASCII, mặc dù tôi chỉ định mã hóa UTF! Điều kỳ lạ là khi tôi in ra dòng trực tiếp (hiển thị dưới dạng bình luận), các ký tự tiếng Pháp xuất hiện hoàn hảo!

Tôi nên làm gì để bảo toàn các ký tự này (é, è, ê, etc.) hoặc chuyển đổi chúng về phiên bản gốc?

+1

Có thể dupli cate [Unicode (utf8) đọc và ghi vào các tệp trong python] (http://stackoverflow.com/questions/491921/unicode-utf8-reading-and-writing-to-files-in-python) – mx0

+3

Không, đọc các filie không phải là vấn đề - xem OP "làm việc nếu tôi in ở đây" bình luận – Greg

Trả lời

6

Chúng không bị mất, chúng chỉ bị thoát khi bạn in danh sách.

Khi bạn in danh sách bằng Python 2, nó gọi phương thức __str__ của chính danh sách, không phải trên từng mục riêng lẻ và phương thức __str__ của danh sách thoát khỏi ký tự không phải ascii của bạn. Xem câu trả lời tuyệt vời này cho giải thích thêm:

How does str(list) work?

Đoạn dưới đây trình bày vấn đề này succintly:

char_list = ['é', 'è', 'ê'] 
print(char_list) 
# ['\xc3\xa9', '\xc3\xa8', '\xc3\xaa'] 

print(', '.join(char_list)) 
# é, è, ê 
+0

Đó chắc chắn là hữu ích, mặc dù nó không có vẻ để sửa chữa vấn đề của tôi. Mã của bạn hoạt động hoàn hảo cho tôi, nhưng vì một lý do nào đó khi tôi gọi 'print (''. Join (cur_letters))' ở cuối mã, nó cho tôi lỗi '[Decode error - output not utf-8]' –

+0

Lỗi này thậm chí còn được ném vào hàm 'trackLetter()' nếu tôi gọi 'print type (a)' trên các ký tự tiếng Pháp –

+0

Ah .. nó có giải quyết được vấn đề của bạn nếu bạn mở tệp thông qua 'codecs.open (" từ. txt "," r "," utf-8 ")'? – Greg

0

Không phải là câu trả lời lý tưởng, nhưng như một cách giải quyết các ký tự tiếng Pháp cũng có thể được thêm theo cách thủ công:

french_letters = ['é', 
     'à', 'è', 'ù', 
     'â', 'ê', 'î', 'ô', 'û', 
     'ç', 
     'ë', 'ï', 'ü'] 

all_letters = cur_letters + french_letters 
Các vấn đề liên quan