Filename.xlsxを含む.Zipアーカイブがあり、Excelシートを1行ずつ解析したいと思います。
この場合、ファイル名をpandas.read_Excelに適切に渡す方法は?
私は試した:
import zipfile
import pandas
myzip=zipfile.ZipFile(filename.Zip)
for fname in myzip.namelist():
with myzip.open(fname) as from_archive:
with pandas.read_Excel(from_archive) as fin:
for line in fin:
....
しかし、それは機能していないようで、結果は次のとおりです。
AttributeError: __exit__
Zipファイルをメモリ内の変数に抽出し、io.BytesIO
を使用して解析できます。
import io
from zipfile import ZipFile
import pandas as pd
def read_Zip(zip_fn, extract_fn=None):
zf = ZipFile(Zip_fn)
if extract_fn:
return zf.read(extract_fn)
else:
return {name:zf.read(name) for name in zf.namelist()}
使用法:
df = pd.read_Excel(io.BytesIO(read_Zip(r'C:\download\test.xlsx.Zip', 'test.xlsx')))
または、Zipファイルからディスクにファイルを抽出して、通常のファイルとして解析することもできます。
PS StackOverflowにはたくさんの例があり、Zipファイルを分解する方法を示しています...
Zipfileの使用
import zipfile
archive = zipfile.ZipFile('filename.Zip', 'r')
xlfile = archive.open('filename.xlsx')
df = pd.read_Excel(xlfile)