【问题标题】:csv.Error: iterator should return strings, not bytescsv.Error:迭代器应该返回字符串,而不是字节
【发布时间】:2012-01-20 20:26:18
【问题描述】:

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 行,在 对于 read 中的行: _csv.Error: 迭代器应该返回字符串,而不是字节(你是否以文本模式打开文件?)

我该如何解决?

【问题讨论】:

    标签: python python-3.x csv


    【解决方案1】:

    您以文本模式打开文件。

    更具体地说:

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

    编码的好猜测是“ascii”和“utf8”。您也可以关闭编码,它将使用系统默认编码,通常是 UTF8,但也可能是其他编码。

    【讨论】:

    • 只是想补充一点,如果您在尝试读取/写入 CSV 文件时遇到编码错误,添加特定编码会有所帮助。我刚刚通过添加“encoding = 'utf-8'”修复了我的这个错误。
    【解决方案2】:

    它抛出异常的原因是你有参数rb,它以二进制模式打开文件。将其更改为r,默认情况下会在text mode 中打开文件。

    您的代码:

    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】:

      在 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) 
      

      【讨论】:

      【解决方案4】:

      您的问题是open 标志中有b。 标志 rt (read, text) 是默认值,因此,使用上下文管理器,只需执行以下操作:

      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 声明又名上下文管理器与这个问题毫无关系!
      • @RayLuo 在演示文件处理时,我还将演示围绕它的最佳实践。我相当一致地这样做。如果您是 Python 新手,并且您在交互式会话中遇到了无法处理的文件,您会很感激我的建议...
      【解决方案5】:

      运行使用 Python 2.6.4 开发的旧 Python 脚本时出现此错误

      更新到 3.6.2 时,我必须从 open 调用中删除所有 'rb' 参数以修复此 csv 读取错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-21
        • 2023-01-22
        • 2017-01-29
        • 1970-01-01
        • 2020-01-10
        • 1970-01-01
        • 2020-12-17
        • 2018-02-15
        相关资源
        最近更新 更多