2011-12-15 26 views
77

Sample.csv निम्नलिखितcsv.Error: इटरेटर सूत्र चाहिए, नहीं तो बाइट्स

NAME Id No Dept 
Tom  1 12 CS 
Hendry 2 35 EC 
Bahamas 3 21 IT 
Frank 4 61 EE 

होता है और अजगर फ़ाइल निम्न कोड

import csv 
ifile = open('sample.csv', "rb") 
read = csv.reader(ifile) 
for row in read : 
    print (row) 

जब मैं अजगर में उपरोक्त कोड को चलाने में शामिल है, मुझे निम्नलिखित अपवाद

File "csvformat.py", line 4, in for row in read : _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

114

आप फ़ाइल को टेक्स्ट मोड में खोलते हैं।

अधिक विशेष रूप से: एन्कोडिंग के लिए

ifile = open('sample.csv', "rt", encoding=<theencodingofthefile>) 

अच्छा अनुमान "ascii" और "UTF8" है। आप एन्कोडिंग को भी छोड़ सकते हैं, और यह सिस्टम डिफ़ॉल्ट एन्कोडिंग का उपयोग करेगा, जो यूटीएफ 8 हो सकता है, लेकिन कुछ और हो सकता है।

+2

बस इसमें जोड़ना चाहते हैं कि अगर आप CSV फ़ाइल से/लिखने का प्रयास करते समय एन्कोडिंग त्रुटियां प्राप्त करते हैं, तो एक विशेष एन्कोडिंग जोड़ने से मदद मिल सकती है। मैंने बस "एन्कोडिंग = 'utf-8' जोड़कर इस बग को ठीक किया है। – covfefe

10

आपकी समस्या यह है कि open ध्वज में आपकी समस्या b है। झंडा rt (पढ़ें, पाठ), डिफ़ॉल्ट है, इसलिए संदर्भ प्रबंधक का उपयोग कर, बस इस कार्य करें:

with open('sample.csv') as ifile: 
    read = csv.reader(ifile) 
    for row in read: 
     print (row) 

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

उपर्युक्त जैसा ही है:

with open('sample.csv', 'r') as ifile: 
    ... 

या

with open('sample.csv', 'rt') as ifile: 
    ... 
41

मैं बस अपना कोड के साथ इस समस्या तय की। यह अपवाद फेंकने का कारण यह है कि आपके पास rb तर्क है। इसे r पर बदलें।

आपका कोड:

import csv 
ifile = open('sample.csv', "rb") 
read = csv.reader(ifile) 
for row in read : 
    print (row) 

नए कोड:

import csv 
ifile = open('sample.csv', "r") 
read = csv.reader(ifile) 
for row in read : 
    print (row) 
3

मैं जब जब 3.6.2 के लिए अद्यतन करने अजगर 2.6.4

साथ विकसित एक पुराने अजगर स्क्रिप्ट चलाने इस त्रुटि थी , मुझे इस सीएसवी पढ़ने त्रुटि को ठीक करने के लिए खुले कॉल से सभी 'आरबी' पैरामीटर को हटाना पड़ा।

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