web-dev-qa-db-ja.com

pythonでcsv zipファイルを読み取る

圧縮されたcsvファイルからデータを取得しようとしています。ファイル全体を解凍せずにこれを行う方法はありますか?そうでない場合、ファイルを解凍して効率的に読み取るにはどうすればよいですか?

18
Elyza Agosta

「zipfile」モジュールを使用してZipを直接インポートしたよpandas dataframe。たとえば、ファイル名が「intfile」で、ZIP内に「THEZIPFILE」という名前だとします。

import pandas as pd
import zipfile

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

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
volker238

zipfileはwith文もサポートしています。

それでパンダを使用することのyaronの答えに追加してください:

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

はい。モジュール「zipfile」が必要です

zipfile.ZipInfo([filename[, date_time]])でZipファイル自体を開きます

次に、ZipFile.infolist()を使用してZip内の各ファイルを列挙し、ZipFile.open(name[, mode[, pwd]])で抽出できます。

4
brycem

Modern Pandasバージョン0.18.1以降、圧縮されたcsvファイルをネイティブでサポートしています:そのread_csvメソッドにはcompressionパラメーター:{'infer'、 'gzip'、 'bz2'、 'Zip'、 'xz'、None}、デフォルトは 'infer'。

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

3

最良の答えは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_)
3

簡単な解決策は以下のコードを使用することです!

import pandas as pd

#pandas support Zip file reads
df = pd.read_csv("/path/to/file.csv.Zip")
2
Hari Prasad