2012-10-05 9 views
9

मैं एक CSV आयात करने के लिए कोशिश कर रहा हूँ आयात करने, इस कोड का उपयोग:UnicodeDecodeError अजगर 3 में जब एक CSV फ़ाइल

foo,bar,test,1,2 
    this,wont,work,because,α 

और त्रुटि:

import csv 
    import sys 

    def load_csv(filename): 
     # Open file for reading 
     file = open(filename, 'r') 

     # Read in file 
     return csv.reader(file, delimiter=',', quotechar='\n') 

    def main(argv): 
     csv_file = load_csv("myfile.csv") 

     for item in csv_file: 
      print(item) 

    if __name__ == "__main__": 
     main(sys.argv[1:]) 

यहाँ मेरी csv फ़ाइल का नमूना दिया गया :

Traceback (most recent call last): 
     File "test.py", line 22, in <module> 
     main(sys.argv[1:]) 
     File "test.py", line 18, in main 
     for item in csv_file: 
     File "/usr/lib/python3.2/encodings/ascii.py", line 26, in decode 
     return codecs.ascii_decode(input, self.errors)[0] 
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 40: ordinal not in range(128) 

जाहिर है, यह सीएसवी के अंत में चरित्र मार रहा है और कहा कि त्रुटि फेंक रहा है, लेकिन मैं इसे ठीक करने के लिए के रूप में एक नुकसान में हूँ । कोई मदद?

यह वह जगह है:

Python 3.2.3 (default, Apr 23 2012, 23:35:30) 
    [GCC 4.7.0 20120414 (prerelease)] on linux2 

उत्तर

10

ऐसा लगता है आपकी समस्या को करने पर निर्भर करता:

print("α") 

आप PYTHONIOENCODING निर्दिष्ट करने के द्वारा इसे ठीक कर सकता है:

$ PYTHONIOENCODING=utf-8 python3 test.py > output.txt 

नोट:

$ python3 test.py 
सुंदर प्रिंटर का उपयोग कर प्रयास करें

को काम करना चाहिए यदि आप हैं आर टर्मिनल विन्यास, यह समर्थन करता है, जहां test.py:

import csv 

with open('myfile.csv', newline='', encoding='utf-8') as file: 
    for row in csv.reader(file): 
     print(row) 

तो open() तो ऊपर कोई encoding पैरामीटर है आप LC_ALL=C साथ UnicodeDecodeError मिलेगा।

LC_ALL=C के साथ आपको UnicodeEncodeError मिलेगा, भले ही कोई पुनर्निर्देशन नहीं है, PYTHONIOENCODING इस मामले में आवश्यक है।

10

python docs से, आप फ़ाइल के लिए एन्कोडिंग सेट करना होगा। यहां साइट से एक उदाहरण दिया गया है:

import csv 

with open('some.csv', newline='', encoding='utf-8') as f: 
    reader = csv.reader(f) 
    for row in reader: 
    print(row) 

संपादित करें: आपकी समस्या प्रिंटिंग के साथ होती है।

import csv 
import pprint 

with open('some.csv', newline='', encoding='utf-8') as f: 
    reader = csv.reader(f) 
    for row in reader: 
    pprint.pprint(row) 
+1

फ़ाइल के लिए एन्कोडिंग सेटिंग कुछ भी नहीं इस मुद्दे को ठीक करने के लिए करता है ... 'फ़ाइल = खुला (फ़ाइल नाम, 'आर', एन्कोडिंग = 'utf-8')' अभी भी मुझे देता है 'UnicodeDecodeError: 'ascii' कोडेक स्थिति 40 में बाइट 0xce को डीकोड नहीं कर सकता: क्रमशः सीमा में नहीं (128) ' –

+0

आह, इसे 'प्रिंट' के साथ करना है जो यूनिकोड वर्ण प्रदर्शित करने में सक्षम नहीं है। क्वारा पर इस प्रश्न का उत्तर हो सकता है - यह सुंदर प्रिंटर का उपयोग करता है: http://www.quora.com/How-do-you-print-a-python-unicode-data- संरचना – TheDude

+1

मुझे लगता है कि त्रुटि में कुछ भी नहीं है प्रिंट के साथ सब कुछ करो। प्रिंट() भी चलने से पहले, यह लूप की शुरुआत में त्रुटि को मार रहा है। पीप्रिंट का उपयोग करके आपका संपादित नमूना कोड पहले जैसा ही त्रुटि उत्पन्न करता है, और इस दावे को और मजबूत करता है। मैं स्टंप हो गया हूँ। –

संबंधित मुद्दे