CSV 应该返回字符串,而不是字节错误

Posted

技术标签:

【中文标题】CSV 应该返回字符串,而不是字节错误【英文标题】:CSV Should Return Strings, Not Bytes Error 【发布时间】:2016-05-01 20:06:19 【问题描述】:

我正在尝试从与我的 Python 脚本不同的目录中读取 CSV 文件。

此外,CSV 文件存储在具有完全相同名称的 ZIP 文件夹中(唯一的区别是一个以 .zip 结尾,另一个是以 .csv 结尾)。

目前我正在使用 Python 的 zipfilecsv 库来打开并从文件中获取数据,但是我收到了错误:

Traceback (most recent call last):   File "write_pricing_data.py", line 13, in <module>
    for row in reader:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

我的代码:

import os, csv
from zipfile import *

folder = r'D:/MarketData/forex'
localFiles = os.listdir(folder)

for file in localFiles:
    zipArchive = ZipFile(folder + '/' + file)

    with zipArchive.open(file[:-4] + '.csv') as csvFile:
        reader = csv.reader(csvFile, delimiter=',')

        for row in reader:
            print(row[0])

我该如何解决这个错误?

【问题讨论】:

您是否在文本编辑器中打开文件以确保内容与您预期的一样? 是的,它们相当大,但仍然是标准的 csv、逗号分隔符等等。 发布错误的完整回溯可能会对您有所帮助。 好的,我更新了我的帖子。 改为这样打开:with zipArchive.open(file[:-4] + '.csv', 'rt') as csvFile: 【参考方案1】:

这有点杂乱无章,我相信有更好的方法(这恰好让我无法理解)。如果您没有嵌入新行,那么您可以使用:

import zipfile, csv

zf = zipfile.ZipFile('testing.csv.zip')
with zf.open('testing.csv', 'r') as fin:
    # Create a generator of decoded lines for input to csv.reader
    # (the csv module is only really happy with ASCII input anyway...)
    lines = (line.decode('ascii') for line in fin)
    for row in csv.reader(lines):
        print(row)

【讨论】:

以上是关于CSV 应该返回字符串,而不是字节错误的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“迭代器应该返回字符串,而不是字节”

将 .csv 文件从 URL 读取到 Python 3.x - _csv.Error:迭代器应返回字符串,而不是字节(您是不是以文本模式打开文件?)

使用 csv_from_result 在 CSV 导出中返回字符串而不是数据库条目

SWIG 'cstring.i' Python 返回字节类型而不是字符串类型

正则表达式类型错误:预期的字符串或类似字节的对象 Python

markdown python ElementTree的tostring方法返回字节而不是字符串