csv.Error: इटरेटर को स्ट्रिंग्स को लौटाना चाहिए, बाइट्स को नहीं


158

Sample.csv में निम्नलिखित शामिल हैं:

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) 

जब मैं पायथन में उपरोक्त कोड चलाता हूं, तो मुझे निम्न अपवाद मिलते हैं:

फ़ाइल "csvformat.py", पंक्ति 4, पंक्ति में पढ़ने के लिए: _csv.Error: पुनरावृति स्ट्रिंग को वापस करना चाहिए, बाइट्स नहीं (क्या आपने फ़ाइल को पाठ मोड में खोला है?)

मेरे द्वारा यह कैसे किया जा सकता है?

जवाबों:


214

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

अधिक विशेष रूप से:

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

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


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

96

मैंने अपने कोड के साथ इस समस्या को ठीक किया। कारण यह है कि अपवाद को फेंक रहा है क्योंकि आपके पास तर्क है 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)

29

आपकी समस्या आपके पास है bमें openझंडा। ध्वज 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:
    ...

withबयान संदर्भ प्रबंधक उर्फ सब पर, इस सवाल का कोई लेना देना नहीं है!
रायलू

4
@RayLuo जब मैं फ़ाइल हैंडलिंग का प्रदर्शन कर रहा हूं, तो मैं इसके आस-पास की सर्वोत्तम प्रथाओं को प्रदर्शित करने जा रहा हूं। मैं ऐसा लगातार करता हूं। यदि आप अजगर को किए जा रहे नए हैं, और आप आप के साथ कुछ नहीं कर सकते एक फ़ाइल के साथ एक इंटरैक्टिव सत्र में अटक, आप मेरी सलाह की सराहना की है | ...
हारून हॉल

24

Python3 में, csv.readerउम्मीद है, कि चलने वाले रिटर्न स्ट्रिंग्स को पारित किया, बाइट्स को नहीं। यहाँ इस समस्या का एक और समाधान है, जो codecsमॉड्यूल का उपयोग करता है:

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

3
ध्यान दें कि यह विकल्प सबसे सुरक्षित नहीं है। यदि आप TextIOWrapper का उपयोग कर सकते हैं, तो आपको करना चाहिए। समस्या का वर्णन: iterd timecode खाली स्ट्रिंग खाती है iterdecode मल्टी-बाइट वर्णों के साथ सुरक्षित नहीं है समाधान: TextIOWrapper एक csv स्ट्रीम पर
kavdev

1
धन्यवाद! पायथन 3 पर इस मुद्दे का सामना कर रहा था।
केनी एयर्स

9

पायथन 2.6.4 के साथ विकसित एक पुरानी अजगर स्क्रिप्ट को चलाते समय मुझे यह त्रुटि हुई थी

3.6.2 में अद्यतन करते समय, मुझे इस csv रीडिंग त्रुटि को ठीक करने के लिए सभी 'rb' मापदंडों को खुली कॉल से हटाना पड़ा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.