2016-11-24 7 views
7

में फ्रेंच अक्षरों को संभालना मैं एक फ़ाइल से डेटा पढ़ रहा हूं जिसमें फ्रेंच और अंग्रेजी अक्षरों वाले शब्द शामिल हैं। मैं सभी संभावित अंग्रेजी और फ्रेंच अक्षरों (तारों के रूप में संग्रहीत) की एक सूची बनाने का प्रयास कर रहा हूं।पायथन

# 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 

इस कोड को प्रिंट निम्नलिखित:

[ 'टी', 'ज', 'ई', 'ओ', 'च', 'एक मैं नीचे दिए गए कोड के साथ ऐसा कर ',' एन ',' डी ',' आई ',' आर ',' एस ',' बी ',' वाई ',' डब्ल्यू ', ' यू ',' एम ',' एल ',' वी ' , 'सी', 'पी', 'जी', 'के', 'एक्स', 'जे', 'जेड', 'क्यू', 'एक्स एक्स 3', '\ xa0', '\ xaa', ' \ xb9 ',' \ xa9 ',' \ xa8 ',' \ xb4 ',' \ xae ',' - ',' \ xe2 ', ' \ x80 ',' \ x99 ',' \ xa2 ',' \ xa7 ',' \ xbb ',' \ xaf ']

जाहिर है एफ यूटीएफ एन्कोडिंग निर्दिष्ट करने के बावजूद, एएससीआईआईआई के कुछ प्रकार के रूपांतरण में छिद्र पत्र खो गए हैं! अजीब बात यह है कि जब मैं सीधे लाइन को प्रिंट करता हूं (एक टिप्पणी के रूप में दिखाया जाता है), फ्रेंच वर्ण पूरी तरह प्रकट होते हैं!

इन वर्णों को सुरक्षित रखने के लिए मुझे क्या करना चाहिए (é, è, ê, etc.), या उन्हें अपने मूल संस्करण में वापस परिवर्तित करें?

+1

संभावित डुप्ली [यूनिकोड (utf8) के कैट को पढ़ने और पाइथन में फ़ाइलों को लिखना] (http://stackoverflow.com/questions/491921/unicode-utf8-reading-and-writing-to-files-in-python) – mx0

+3

नहीं, पढ़ना फाइली मुद्दा नहीं है - ओपी के "अगर मैं यहां प्रिंट करता हूं तो काम करता है" टिप्पणी – Greg

उत्तर

6

वे खो नहीं गए हैं, जब आप सूची प्रिंट करते हैं तो वे बच निकले हैं।

जब आप पायथन 2 में एक सूची मुद्रित करते हैं, तो यह सूची के __str__ विधि को कॉल करता है, प्रत्येक व्यक्तिगत आइटम पर नहीं, और सूची की __str__ विधि आपके गैर-असीसी वर्णों से बच जाती है। अधिक विवरण के लिए इस उत्कृष्ट जवाब देखें:

How does str(list) work?

निम्नलिखित स्निपेट succintly मुद्दे को दर्शाता है:

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

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

यह निश्चित रूप से सहायक है, हालांकि यह मेरी समस्या को ठीक नहीं कर रहा है। आपका कोड मेरे लिए पूरी तरह से काम करता है, लेकिन किसी कारण से जब मैं अपने कोड के अंत में 'प्रिंट (' '। Join (cur_letters))' कॉल करता हूं तो यह मुझे त्रुटि देता है '[डीकोड त्रुटि - आउटपुट नहीं utf-8] ' –

+0

यह त्रुटि मेरे 'trackLetter()' फ़ंक्शन में भी फेंक दी गई है यदि मैं फ्रेंच वर्ण –

+0

आह पर 'प्रिंट प्रकार (ए)' कहता हूं .. यदि आप 'codecs.open ("शब्दों के माध्यम से फ़ाइल खोलते हैं तो यह आपकी समस्या का समाधान करता है। txt "," r "," utf-8 ")'? – Greg

0

नहीं एक आदर्श जवाब, लेकिन एक समाधान के रूप फ्रेंच पात्रों भी कर सकते हैं मैन्युअल रूप से जोड़ा जाए:

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

all_letters = cur_letters + french_letters