csv.Error: iterator sẽ trả về chuỗi, không phải byte


158

Sample.csv chứa các mục sau:

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

Và tệp Python chứa mã sau đây:

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

Khi tôi chạy mã trên trong Python, tôi nhận được ngoại lệ sau:

Tệp "csvformat.py", dòng 4, trong hàng đã đọc: _csv.Error: iterator sẽ trả về chuỗi, không phải byte (bạn đã mở tệp ở chế độ văn bản chưa?)

Làm thế nào tôi có thể sửa chữa nó?

Câu trả lời:


214

Bạn mở tệp ở chế độ văn bản.

Cụ thể hơn:

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

Dự đoán tốt cho mã hóa là "ascii" và "utf8". Bạn cũng có thể tắt mã hóa và nó sẽ sử dụng mã hóa mặc định của hệ thống, có xu hướng là UTF8, nhưng có thể là một thứ khác.


4
Chỉ muốn thêm vào điều này rằng nếu bạn gặp lỗi mã hóa khi bạn thử đọc / ghi từ / vào tệp CSV, việc thêm một mã hóa cụ thể có thể giúp ích. Tôi vừa sửa lỗi này bằng cách thêm "mã hóa = 'utf-8'".
covfefe

96

Tôi chỉ sửa vấn đề này với mã của tôi. Lý do nó ném ngoại lệ đó là vì bạn có lý lẽ rb. Thay đổi điều đó thành r.

Ma cua ban:

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

Mã mới:

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

29

Vấn đề của bạn là bạn có btrong opencờ. Cờ rt(đọc, văn bản) là mặc định, vì vậy, bằng cách sử dụng trình quản lý bối cảnh, chỉ cần thực hiện việc này:

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

Trình quản lý bối cảnh có nghĩa là bạn không cần xử lý lỗi chung (mà không có vấn đề gì bạn có thể bị kẹt với tệp đang mở, đặc biệt là trong trình thông dịch), vì nó sẽ tự động đóng tệp khi có lỗi hoặc thoát khỏi ngữ cảnh.

Trên đây là giống như:

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

hoặc là

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

Các withtuyên bố còn gọi là quản lý bối cảnh không có gì để làm với câu hỏi này, ở tất cả!
RayLuo

4
@RayLuo Khi tôi trình diễn xử lý tệp, tôi cũng sẽ trình bày các thực tiễn tốt nhất xung quanh nó. Tôi làm điều đó khá nhất quán. Nếu bạn chưa quen với Python và bạn bị mắc kẹt trong một phiên tương tác với một tệp mà bạn không thể làm gì với, bạn sẽ đánh giá cao lời khuyên của tôi ...
Aaron Hall

24

Trong Python3, csv.readermong đợi, thông qua iterable trả về chuỗi, không phải byte. Đây là một giải pháp nữa cho vấn đề này, đó là sử dụng codecsmô-đun:

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

3
Lưu ý rằng tùy chọn này không an toàn nhất. Nếu bạn có thể sử dụng TextIOWrapper, bạn nên. Mô tả sự cố: iterdecode ăn chuỗi rỗng iterdecode không an toàn với các ký tự nhiều byte Giải pháp: TextIOWrapper trên luồng csv
kavdev

1
Cảm ơn! đã phải đối mặt với vấn đề này trên Python3.
Kenny Aires

9

Tôi đã gặp lỗi này khi chạy tập lệnh python cũ được phát triển với Python 2.6.4

Khi cập nhật lên 3.6.2, tôi đã phải xóa tất cả các tham số 'rb' khỏi các cuộc gọi mở để khắc phục lỗi đọc csv này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.