2016-05-27 24 views
11

私は25GBのテキストファイルを持っています。私はそれをtar.gzに圧縮し、450 MBになりました。今、私はPythonからそのファイルを読み込み、テキストデータを処理したいと思います。これは私がquestionを参照しています。私の場合はコードが機能しません。次のようにコードは次のとおりです。Pythonで.tar.gzファイルを読む

import tarfile 
import numpy as np 

tar = tarfile.open("filename.tar.gz", "r:gz") 
for member in tar.getmembers(): 
    f=tar.extractfile(member) 
    content = f.read() 
    Data = np.loadtxt(content) 

次のようにエラーがある:

Traceback (most recent call last): 
    File "dataExtPlot.py", line 21, in <module> 
    content = f.read() 
AttributeError: 'NoneType' object has no attribute 'read' 

また、このタスクを実行する他の方法はありますか?

+1

http://stackoverflow.com/q/33113600/ような何か1240268 –

+1

*メンバーが上記のいずれでもない場合、Noneが返されます。*、メンバーはファイルまたはリンクではありません。 –

答えて

14

docsは、メンバーがいない通常のファイルやリンクの場合なしextractfile()で返されていないことを教えて。

一つの可能​​な解決策結果なしをスキップすることです:メンバーがファイルでもリンクでもない場合

tar = tarfile.open("filename.tar.gz", "r:gz") 
for member in tar.getmembers(): 
    f = tar.extractfile(member) 
    if f is not None: 
     content = f.read() 
3

tarfile.extractfile()Noneを返すことができます。たとえば、tarアーカイブにディレクトリまたはデバイスファイルが含まれている可能性があります。修正するには:

import tarfile 
import numpy as np 

tar = tarfile.open("filename.tar.gz", "r:gz") 
for member in tar.getmembers(): 
    f = tar.extractfile(member) 
    if f: 
     content = f.read() 
     Data = np.loadtxt(content) 
1

をあなたはこの1

t = tarfile.open("filename.gz", "r") 
for filename in t.getnames(): 
    try: 
     f = t.extractfile(filename) 
     Data = f.read() 
     print filename, ':', Data 
    except : 
     print 'ERROR: Did not find %s in tar archive' % filename 
+0

コードスニペットありがとう。あなたは2度読んでいます.1回は "データ"変数を設定し、次回は印刷します。それを修正するコードを変更できますか? –

+0

@SaurabhHiraniが変更されました。ご報告いただきありがとうございます。 – VICTOR

1

を試みるかもしれあなたはそのようなリンクなどの一部の特殊ファイルの内容を「読む」ことができない、まだタールは、それらをサポートし、tarファイルは、彼らは大丈夫抽出します。 tarfileがそれらを抽出すると、ファイルのようなオブジェクトを返しませんが、Noneを返します。そして、あなたのtarballにそのような特別なファイルが含まれているので、エラーが発生します。

1つの方法は、あなたがそれを抽出する前に処理しているtarballのエントリのタイプを判断することです。この情報を手にして、ファイルを "読む"ことができるかどうかを判断できます。これを達成するには、tarfile.getmembers()を返します。tarfile.TarInfoには、tarballに含まれるファイルの種類に関する詳細情報が含まれています。

tarfile.TarInfoクラスでは、タールメンバーの種類を決定するために必要なすべての属性とメソッドを持っているようなisfile()isdir()またはtinfo.islnk()またはtinfo.issym()とそれに応じて、各メンバー(抽出物またはない、など)とに何をすべきかを決定します。

私は特別な方法で特別なファイルやプロセスへのリンクを抽出スキップする this patched tarfileでファイルの種類をテストするためにこれらを使用する例えば

for tinfo in tar.getmembers(): 
    is_special = not (tinfo.isfile() or tinfo.isdir() 
         or tinfo.islnk() or tinfo.issym()) 
... 
関連する問題