2016-11-24 36 views
7

Czytam dane z pliku zawierającego słowa z francuskimi i angielskimi literami. Próbuję skonstruować listę wszystkich możliwych angielskich i francuskich liter (zapisanych jako ciągi). Zrobić to z kodem:Obsługa francuskich liter w Pythonie

# 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 

Kod drukuje następujące:

[ 't', 'h', 'e', ​​'o', 'f', „a "," 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 ']

Oczywiście F litery rench zostały utracone w pewnym rodzaju konwersji do ASCII, mimo że określam kodowanie UTF! Dziwne jest to, kiedy bezpośrednio wydrukuję linię (pokazaną jako komentarz), znaki francuskie wyglądają idealnie!

Co należy zrobić, aby zachować te znaki (é, è, ê, etc.), lub przekonwertować je z powrotem na ich oryginalną wersję?

+1

Możliwe dupli cate z [Unicode (utf8) czytania i pisania do plików w pythonie] (http://stackoverflow.com/questions/491921/unicode-utf8-reading-andwriting-to-files-in-python) – mx0

+3

Nie, czytanie nie jest to problemem - zobacz komentarz OP "działa, jeśli tu wydrukuję" – Greg

Odpowiedz

6

Nie są zgubione, po prostu uciekają po wydrukowaniu listy.

Kiedy drukujesz listę w Pythonie 2, wywołuje ona metodę __str__ samej listy, a nie na każdym pojedynczym przedmiocie, a metoda z listy __str__ wymyka się twoim nie-ascii. Zobacz tę doskonałą odpowiedź na więcej wyjaśnień:

How does str(list) work?

Poniższy fragment kodu demonstruje problem succintly:

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

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

Jest to zdecydowanie pomocne, chociaż wydaje się, że nie rozwiązało to mojego problemu. Twój kod działa idealnie dla mnie, ale z jakiegoś powodu, kiedy nazywam 'print ('.. Join (cur_letters))' na końcu mojego kodu daje mi błąd '[Błąd dekodowania - wyjście nie utf-8]' –

+0

Ten błąd jest nawet zgłaszany w mojej funkcji 'trackLetter()', jeśli nazywam 'typ wydruku (a)' na francuskich znakach –

+0

Ah .. czy to rozwiąże problem, jeśli otworzysz plik przez 'codecs.open (" words. txt "," r "," utf-8 ")'? – Greg

0

Nie idealną odpowiedź, ale jako obejście francuskie Postacie mogą również należy dodać ręcznie:

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

all_letters = cur_letters + french_letters