【问题标题】:Convert binary input stream to text mode将二进制输入流转换为文本模式
【发布时间】:2023-04-04 00:59:01
【问题描述】:

我正在尝试在 Python 3.2 中读取 bzip2 压缩的 CSV 文件。对于未压缩的 CSV 文件,此方法有效:

datafile = open('./file.csv', mode='rt')
data = csv.reader(datafile)
for e in data:    # works
    process(e)

问题是BZ2File只支持创建二进制流,而在Python 3中,csv.reader accepts only text streams。 (gzip 和 zip 文件也会出现同样的问题。)

datafile = bz2.BZ2File('./file.csv.bz2', mode='r')
data = csv.reader(datafile)
for e in data:    # error
    process(e)

特别是,指示的行会引发异常_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

我也试过data = csv.reader(codecs.EncodedFile(datafile, 'utf8')),但这并不能解决错误。

如何包装二进制输入流,使其可以在文本模式下使用??

【问题讨论】:

    标签: python file-io io stream python-3.x


    【解决方案1】:

    这对我有用:

    import codecs, csv
    f = codecs.open("file.csv", "r", "utf-8")
    g = csv.reader(f)
    for e in g:
        print(e)
    

    在 BZ2 的情况下:

    import codecs, csv, bz2
    f = bz2.BZ2File("./file.csv.bz2", mode="r")
    c = codecs.iterdecode(f, "utf-8")
    g = csv.reader(c)
    for e in g:
        print(e)
    

    【讨论】:

    • 您打算如何将它与 bz2 压缩文件一起使用?
    • @vz0:最后要检查的细节是换行符的解释是否按预期工作(即没有解释)。换句话说,如果换行序列可以包含在引用的值中,则未压缩的 CSV 将使用 open(fname, 'r', newlines='')。很可能,它可以正常工作。可以试试吗?
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 2011-08-12
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多