4

私はpythonが初めてです。.tar.gz ファイルの内容を python に読み込もうとすると、何が間違っているのかわかりません。読みたい tarfile は、次の Web アドレスでホストされています。

ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/b0/ac/Breast_Cancer_Res_2001_Nov_9_3(1)_61-65.tar.gz

このサイトのファイルに関する詳細情報 (内容を信頼できるように) http://www.pubmedcentral.nih.gov/utils/oa/oa.fcgi?id=PMC13901

tarfile には、ジャーナル記事の .pdf および .nxml コピーが含まれています。また、いくつかの画像ファイルもあります。

コピーして貼り付けてブラウザでファイルを開くと。PC 上の場所に保存し、次のコマンドを使用して tarfile を正常にインポートできます (注: 場所に保存すると、winzip はファイルを .tar.gz から単に .tar に変更します)。

import tarfile
thetarfile = "C:/Users/dfcm/Documents/Breast_Cancer_Res_2001_Nov_9_3(1)_61-65.tar"
tfile = tarfile.open(thetarfile)
tfile

ただし、同様のコマンドを使用してファイルに直接アクセスしようとすると、次のようになります。

thetarfile = "ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/b0/ac/Breast_Cancer_Res_2001_Nov_9_3(1)_61-65.tar.gz"
bbb = tarfile.open(thetarfile)

その結果、次のエラーが発生します。

 Traceback (most recent call last):
 File "<pyshell#137>", line 1, in <module>
 bbb = tarfile.open(thetarfile)
 File "C:\Python30\lib\tarfile.py", line 1625, in open
 return func(name, "r", fileobj, **kwargs)
 File "C:\Python30\lib\tarfile.py", line 1687, in gzopen
 fileobj = bltn_open(name, mode + "b")
 File "C:\Python30\lib\io.py", line 278, in __new__
 return open(*args, **kwargs)
 File "C:\Python30\lib\io.py", line 222, in open
 closefd)
 File "C:\Python30\lib\io.py", line 615, in __init__
 _fileio._FileIO.__init__(self, name, mode, closefd)
 IOError: [Errno 22] Invalid     argument: 'ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/b0/ac/Breast_Cancer_Res_2001_Nov_9_3(1)_61-65.tar'

.tar.gz ファイルを Web アドレスから直接読み取ろうとするときに、私が間違っていることを誰か説明できますか? 前もって感謝します。クリス

4

1 に答える 1

15

残念ながら、ネットワークからファイルを開くことはできません。ここでは少し複雑です。ネットワーク要求を作成し、要求状態を表すオブジェクトを作成するようにインタープリターに指示する必要があります。urllibこれは、モジュールを使用して実行できます。

import urllib.request
import tarfile
thetarfile = "ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/b0/ac/Breast_Cancer_Res_2001_Nov_9_3(1)_61-65.tar.gz"
ftpstream = urllib.request.urlopen(thetarfile)
thetarfile = tarfile.open(fileobj=ftpstream, mode="r|gz")

ftpstreamオブジェクトは、ftp サーバーへの接続を表すファイルのようなものです。その後、tarfile モジュールはこのストリームにアクセスできます。ファイル名を渡さないため、modeパラメータで圧縮を指定する必要があります。

于 2013-09-04T16:21:33.750 に答える