csv.Error: yineleyici dizeleri değil dizeleri döndürmelidir


160

Sample.csv aşağıdakileri içerir:

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

Ve Python dosyası aşağıdaki kodu içerir:

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

Python yukarıdaki kodu çalıştırdığınızda, aşağıdaki özel durumu alıyorum:

"Csvformat.py" dosyası, satır 4, şu satırdaki satır için: _csv.Error: yineleyici bayt değil, dizeleri döndürmelidir (dosyayı metin modunda açtınız mı?)

Nasıl düzeltebilirim?

Yanıtlar:


215

Dosyayı metin modunda açarsınız.

Daha spesifik olarak:

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

Kodlama için iyi tahminler "ascii" ve "utf8" dir. Ayrıca kodlamayı kapalı bırakabilirsiniz ve UTF8 olma eğiliminde olan, ancak başka bir şey olabilecek sistem varsayılan kodlamasını kullanır.


4
Sadece bunu bir CSV dosyasına okuma / yazma denediğinizde kodlama hataları alırsanız, belirli bir kodlamanın eklenmesinin yardımcı olabileceğini eklemek istersiniz. Ben sadece "kodlama = 'utf-8'" ekleyerek bu hatayı mayın üzerinde düzeltti.
covfefe

97

Kodumla bu sorunu düzelttim. Bu istisnayı atmasının nedeni, tartışmanızın olmasıdır rb. Bunu olarak değiştirin r.

Senin kodun:

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

Yeni kod:

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

29

Senin sorunun var olduğu biçinde openbayrak. Bayrak rt(okuma, metin) varsayılan değerdir, bu nedenle bağlam yöneticisini kullanarak şunu yapın:

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

Bağlam yöneticisi, genel bir hata işlemeye ihtiyacınız olmadığı anlamına gelir (bu olmadan dosya açıkken, özellikle bir yorumlayıcıda sıkışıp kalabilir), çünkü dosyayı bir hatada veya bağlamdan çıkarken otomatik olarak kapatacaktır.

Yukarıdaki ile aynıdır:

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

veya

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

withBağlam Müdürü aka deyimi hiç bu soru ile ilgisi yok!
RayLuo

4
@RayLuo Dosya işlemeyi gösterirken, etrafındaki en iyi uygulamaları da göstereceğim. Bunu oldukça tutarlı bir şekilde yapıyorum. Python'da yeniyseniz ve hiçbir şey yapamayacağınız bir dosya ile etkileşimli bir oturumda sıkışırsanız, tavsiyemi takdir edersiniz ...
Aaron Hall

24

Python3'te, yinelenebilir csv.readergeçen iletiler baytları değil, dizeleri döndürür. codecsModül kullanan bu soruna bir çözüm daha :

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

3
Bu seçeneğin en güvenli olmadığını unutmayın. TextIOWrapper'ı kullanabiliyorsanız, yapmalısınız. Sorun açıklamaları: iterdecode boş dizeleri yiyen iterdecode çok baytlık karakterlerle güvenli değildir : Çözüm TextIOWrapper bir csv akışta
kavdev

1
Teşekkürler! Python3'te bu sorunla karşı karşıyaydı.
Kenny Aires

9

Python 2.6.4 ile geliştirilen eski bir python betiği çalıştırırken bu hatayla karşılaştım

3.6.2'ye güncellerken, bu csv okuma hatasını düzeltmek için tüm 'rb' parametrelerini açık çağrılardan kaldırmak zorunda kaldım .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.