2017-04-19 13 views
2

私は、各zipファイルには、3つの異なるtxtファイルが含まれている私のパスに保存されている多くのzipファイルパンダ:複数のtxtファイルを含むzipファイルを読み込む方法は?

  • mypath/data1.zip
  • mypath/data2.zip
  • など

を持っています。例えば、data1.zipにあります:

  • data1_a.txt
  • data1_b.txt
  • data1_c.txt

私は(ETCつまり、data1_c.txtdata2_c.txtdata3_c.txt、)各zip形式のファイルからdatai_c.txtをロードする必要がありますこれらをデータフレームに連結します。

read_csvを使用して残念ながら私はこれを行うことができません。これは、単一の圧縮ファイルでのみ機能するためです。

どのようにすればいいですか?ありがとう!

答えて

3

zipファイルにアクセスするには、他のコードが必要です。以下は、O'ReillyののPythonクックブックからのコード

import zipfile 
import pandas as pd 
## make up some data for example 
x = pd.DataFrame({"A": [1, 2], "B": [3, 4]}) 
x.to_csv('a.txt', sep="|", index=False) 
(x * 2).to_csv('b.txt', sep="|", index=False) 

with zipfile.ZipFile('zipfile.zip', 'w') as myzip: 
    myzip.write('a.txt') 
    myzip.write('b.txt') 
    for filename in z.namelist(): print 'File:', filename, 
     insideDF = pd.read_csv(StringIO(z.read(filename))) 
     df = pd.concat([df, insideDF]) 
print df 
+0

非常に甘い。ここには何も書かれていない、正しい? –

+1

が正しい。 zipファイルから直接読み取ります。私は、舞台裏でPythonが一時ファイルや何を使用しているのかはわかりませんが、長期的には何も残っていません。 –

+0

私は '0 |||| -8267.36 | -8367.36 || 12.77 | 18.77 | 12.77 | -8785.3 | -8785.3 | -8785.3 |||| 1 |のような長い出力を得ます。 'read_csv'に' sep = '|' 'を指定した後に' は存在しません。何か案は? –

1

あなたは次のようにpatoolライブラリと仕事をしたい:

import patool 
import pandas as pd 
compression = zipfile.ZIP_DEFLATED 
patoolib.extract_archive('mypath/data1.zip', outdir='mypath', interactive=False, verbosity=-1) 

read_csvを使用してDataFrameでeachtxtファイルのように: DF = pd.read_csv( 'mypathで/ data1_a')を

pd.concatを使用して任意の方法でデータフレームを連結します。

+0

おかげで変更されたが、私はパスにアーカイブを解凍する必要はありません。それは私のディスク容量のすべてを消費するでしょう。 –

+1

アーカイブから特定のファイルだけを抽出したいのですか? – splinter

+0

私はすべてがメモリ内で起こることを望んでいます(それが理にかなっていれば)。私はフォルダに何も書いていけません –

関連する問題