csv.Error: iterator ควรส่งคืนสตริงไม่ใช่ไบต์


159

Sample.csv มีดังต่อไปนี้:

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

และไฟล์ Python มีรหัสต่อไปนี้:

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

เมื่อฉันเรียกใช้รหัสข้างต้นใน Python ฉันได้รับข้อยกเว้นต่อไปนี้:

ไฟล์ "csvformat.py" บรรทัดที่ 4 ในแถวที่อ่าน: _csv.Error: iterator ควรส่งคืนสตริงไม่ใช่ไบต์ (คุณเปิดไฟล์ในโหมดข้อความหรือไม่)

ฉันจะแก้ไขได้อย่างไร

คำตอบ:


215

คุณเปิดไฟล์ในโหมดข้อความ

โดยเฉพาะอย่างยิ่ง:

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

การเดาที่ดีสำหรับการเข้ารหัสคือ "ascii" และ "utf8" นอกจากนี้คุณยังสามารถปล่อยการเข้ารหัสไว้และมันจะใช้การเข้ารหัสเริ่มต้นของระบบซึ่งมีแนวโน้มที่จะเป็น UTF8 แต่อาจเป็นอย่างอื่น


4
เพียงต้องการเพิ่มลงในสิ่งนี้หากคุณได้รับข้อผิดพลาดในการเข้ารหัสเมื่อคุณลองอ่าน / เขียนจาก / ไปยังไฟล์ CSV การเพิ่มการเข้ารหัสเฉพาะสามารถช่วยได้ ฉันเพิ่งแก้ไขข้อผิดพลาดนี้กับฉันโดยเพิ่ม "encoding = '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งบ aka ผู้จัดการบริบทมีอะไรจะทำอย่างไรกับคำถามนี้ที่ทุกคน!
RayLuo

4
@ RayLuo เมื่อฉันสาธิตการจัดการไฟล์ฉันจะสาธิตวิธีปฏิบัติที่ดีที่สุดรอบ ๆ ฉันทำอย่างนั้นค่อนข้างสม่ำเสมอ หากคุณยังใหม่กับ Python และคุณติดอยู่ในเซสชั่นแบบโต้ตอบกับไฟล์ที่คุณไม่สามารถทำอะไรได้คุณจะต้องขอบคุณคำแนะนำของฉัน ...
Aaron Hall

24

ใน Python3 csv.readerคาดว่าผ่านการ iterable ส่งคืนสตริงไม่ใช่ไบต์ นี่คืออีกหนึ่งวิธีการแก้ไขปัญหานี้ที่ใช้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 คุณควร คำอธิบายปัญหา: iterdecode กินสตริงว่าง iterdecode ไม่ปลอดภัยด้วยอักขระหลายไบต์ วิธีแก้ปัญหา: TextIOWrapper บนสตรีม csv
24419

1
ขอบคุณ! พบปัญหานี้ใน Python3
Kenny Aires

9

ฉันมีข้อผิดพลาดนี้เมื่อเรียกใช้สคริปต์หลามเก่าพัฒนาด้วย Python 2.6.4

เมื่ออัปเดตเป็น 3.6.2 ฉันต้องลบพารามิเตอร์ 'rb' ทั้งหมดออกจากสายที่เปิดอยู่เพื่อแก้ไขข้อผิดพลาดในการอ่าน csv นี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.