【问题标题】:Read contents of .tar.gz file from website into a python 3.x object将 .tar.gz 文件的内容从网站读取到 python 3.x 对象中
【发布时间】:2013-09-04 14:57:46
【问题描述】:

我是 python 新手。尝试将 .tar.gz 文件的内容读入 python 时,我无法弄清楚我做错了什么。我想阅读的 tar 文件托管在以下网址:

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

tar 文件包含期刊文章的 .pdf 和 .nxml 副本。还有几个图片文件。

如果我通过复制和粘贴在浏览器中打开文件。我可以保存到我的 PC 上的某个位置并使用以下命令导入 tar 文件(注意:当我保存到该位置时,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 文件时,谁能解释我做错了什么?提前致谢。克里斯

【问题讨论】:

    标签: python python-3.x tar tarfile


    【解决方案1】:

    很遗憾,您不能只打开网络上的文件。这里的情况有点复杂。您必须指示解释器创建网络请求并创建表示请求状态的对象。这可以使用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 参数中指定压缩。

    【讨论】:

      猜你喜欢
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      相关资源
      最近更新 更多