【问题标题】:Reading CSV files from zip archive with python-3.x使用 python-3.x 从 zip 存档中读取 CSV 文件
【发布时间】:2018-05-09 18:20:23
【问题描述】:

我有一个压缩存档,其中包含多个 csv 文件。

例如,假设myarchive.zip 包含myfile1.csvmyfile2.csvmyfile3.csv

python 2.7 中,我能够迭代地加载myfiles 中的所有pandas 使用

import pandas as pd
import zipfile

with zipfile.ZipFile(myarchive.zip, 'r') as zippedyear:
 for filename in ['myfile1.csv', 'myfile2.csv', 'myfile3.csv']:
     mydf = pd.read_csv(zippedyear.open(filename))

现在用Python 3 做同样的事情会抛出错误

ParserError:迭代器应该返回字符串,而不是字节(你打开了吗? 文本模式的文件?)

我在这里不知所措。知道是什么问题吗? 谢谢!

【问题讨论】:

    标签: python python-3.x pandas zipfile


    【解决方案1】:

    确实很奇怪,因为您可以指定的唯一模式是 r/w(字符模式)。

    这里有一个解决方法;使用file.read 读取文件,将数据加载到StringIO 缓冲区,并将其传递给read_csv

    from io import StringIO
    
    with zipfile.ZipFile(myarchive.zip, 'r') as zippedyear:
        for filename in ['myfile1.csv', 'myfile2.csv', 'myfile3.csv']:
             with zippedyear.open(filename) as f:
                 mydf = pd.read_csv(io.StringIO(f.read()))
    

    【讨论】:

    • 谢谢,很有用。你知道为什么它现在可以与 StringIO 一起使用吗?它在做什么?
    • @ℕʘʘḆḽḘ read_csv 应该接受任何文件或类似对象的文件,StringIO 就是其中之一。我所做的只是正常地从文件中读取并将其通过管道传输到字符串缓冲区中,然后让 pandas 读取它。刚刚介绍了一个值得信赖的中间人;)
    • 有趣。你认为这可能与这一点有关吗? webkul.com/blog/using-io-for-creating-file-object
    • @ℕʘʘḆḽḘ 对不起,和什么有关?
    • Fwiw,我必须使用io.StringIO(f.read().decode()) 明确地将decode() 字节转换为str。但我使用的是csv.DictReader 而不是 pd。
    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2016-04-06
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多