在python中读取csv压缩文件

Posted

技术标签:

【中文标题】在python中读取csv压缩文件【英文标题】:Reading csv zipped files in python 【发布时间】:2015-01-12 13:57:15 【问题描述】:

我正在尝试从压缩的 csv 文件中获取数据。有没有办法在不解压缩整个文件的情况下做到这一点?如果没有,我怎样才能解压缩文件并有效地阅读它们?

【问题讨论】:

在此处查看我的答案 [无需下载 zip 文件]***.com/a/45771620/348168 【参考方案1】:

如果你有一个文件名:my_big_file.csv 并且你用相同的名称压缩它my_big_file.zip

你可以这样做:

df = pd.read_csv("my_big_file.zip")

注意:首先检查您的 pandas 版本(不适用于旧版本)

【讨论】:

【参考方案2】:

假设您正在下载一个包含 CSV 的 zip 文件,并且您不想使用临时存储。以下是示例实现的样子:

#!/usr/bin/env python3

from csv import DictReader
from io import TextIOWrapper, BytesIO
from zipfile import ZipFile

import requests

def all_tickers():
    url = "https://simfin.com/api/bulk/bulk.php?dataset=industries&variant=null"
    r = requests.get(url)
    zip_ref = ZipFile(BytesIO(r.content))
    for name in zip_ref.namelist():
        print(name)
        with zip_ref.open(name) as file_contents:
            reader = DictReader(TextIOWrapper(file_contents, 'utf-8'), delimiter=';')
            for item in reader:
                print(item)

这会处理所有 python3 字节/字符串问题。

【讨论】:

【参考方案3】:

我使用 zipfile 模块将 ZIP 直接导入到 pandas 数据帧。 假设文件名是“intfile”,它在名为“THEZIPFILE”的 .zip 中:

import pandas as pd
import zipfile

zf = zipfile.ZipFile('C:/Users/Desktop/THEZIPFILE.zip') 
df = pd.read_csv(zf.open('intfile.csv'))

【讨论】:

这是关于这个主题的最有用(和简洁)的一个。谢谢!【参考方案4】:

这是我一直使用的最简单的东西。

import pandas as pd
df = pd.read_csv("Train.zip",compression='zip')

【讨论】:

【参考方案5】:

如果您不使用 Pandas,则可以完全使用标准库来完成。这是 Python 3.7 代码:

import csv
from io import TextIOWrapper
from zipfile import ZipFile

with ZipFile('yourfile.zip') as zf:
    with zf.open('your_csv_inside_zip.csv', 'r') as infile:
        reader = csv.reader(TextIOWrapper(infile, 'utf-8'))
        for row in reader:
            # process the CSV here
            print(row)

【讨论】:

我尝试这样做并没有意识到我需要 io.TextIOWrapper。我怎么会知道? @KenIngram ZipFile.open() 给出一个 zipfile.ZipExtFile 对象。内置函数open()函数直接返回一个_io.TextIOWrapper对象 酷。感谢您的信息。【参考方案6】:

可以使用下面的代码快速解决!

import pandas as pd

#pandas support zip file reads
df = pd.read_csv("/path/to/file.csv.zip")

【讨论】:

出色的答案!我检查使用没有“.csv”扩展名的相同解决方案是否也有效:df = pd.read_csv("/path/to/file.zip")【参考方案7】:

Modern Pandas 从 0.18.1 版本开始原生支持压缩的 csv 文件:它的 read_csv 方法有 compression 参数:'infer', 'gzip', 'bz2', 'zip','xz',无,默认'推断'。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html

【讨论】:

【参考方案8】:

认为 Yaron 有最好的答案,但我想我会添加一个代码来遍历 zip 文件夹中的多个文件。然后它将附加结果:

import os
import pandas as pd
import zipfile

curDir = os.getcwd()
zf = zipfile.ZipFile(curDir + '/targetfolder.zip')
text_files = zf.infolist()
list_ = []

print ("Uncompressing and reading data... ")

for text_file in text_files:
    print(text_file.filename)
    df = pd.read_csv(zf.open(text_file.filename)
    # do df manipulations
    list_.append(df)

df = pd.concat(list_)

【讨论】:

【参考方案9】:

zipfile 也支持 with 语句。

所以添加到 yaron 使用 pandas 的答案:

with zipfile.ZipFile('file.zip') as zip:
    with zip.open('file.csv') as myZip:
        df = pd.read_csv(myZip) 

【讨论】:

【参考方案10】:

是的。你想要模块'zipfile'

你用zipfile.ZipInfo([filename[, date_time]])打开压缩文件本身

然后您可以使用 ZipFile.infolist() 枚举 zip 中的每个文件,并使用 ZipFile.open(name[, mode[, pwd]]) 提取它

【讨论】:

以上是关于在python中读取csv压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

python csv读取方法及常用的csv读取代码

Spark 2.1.0:读取压缩的 csv 文件

读取 .csv 文件比读取压缩为 .gz 的相同文件更快

如何从压缩文件中读取多个文件?

Impala 外部表读取未压缩文件但具有名称 (*.csv.gz)

如何使用带有 gzip 压缩选项的 pandas read_csv 读取 tar.gz 文件?