我正在尝试从压缩的csv文件中获取数据。有没有办法在不解压缩整个文件的情况下执行此操作?如果没有,我如何解压缩文件并有效地阅读它们?
答案 0 :(得分:24)
我使用" zipfile"模块直接导入ZIP和pandas数据帧。 让我们说文件名是" intfile"它的拉链名为" THEZIPFILE"。
import pandas as pd
import zipfile
zf = zipfile.ZipFile('C:/Users/Desktop/THEZIPFILE.zip')
df = pd.read_csv(zf.open('intfile.csv'))
答案 1 :(得分:3)
是。你想要模块'zipfile'
您使用zipfile.ZipInfo([filename[, date_time]])
然后,您可以使用ZipFile.infolist()
枚举zip中的每个文件,并使用ZipFile.open(name[, mode[, pwd]])
答案 2 :(得分:3)
zipfile也支持with语句。
所以加入yaron使用熊猫的答案:
with zipfile.ZipFile('file.zip') as zip:
with zip.open('file.csv') as myZip:
df = pd.read_csv(myZip)
答案 3 :(得分:2)
认为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 _)
答案 4 :(得分:2)
自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
答案 5 :(得分:2)
可以使用以下代码作为快速解决方案!
import pandas as pd
#pandas support zip file reads
df = pd.read_csv("/path/to/file.csv.zip")
答案 6 :(得分: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 字节/字符串问题。
答案 7 :(得分:1)
如果您不使用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)
答案 8 :(得分:0)
这是我经常使用的最简单的方法。
import pandas as pd
df = pd.read_csv("Train.zip",compression='zip')
答案 9 :(得分:0)