2013-09-04 2 views
3

Я новичок в python. Я не могу понять, что я делаю неправильно, пытаясь прочитать содержимое файла .tar.gz в python. Я бы файл обработан хотел читать размещен на следующем веб-адрес:Прочтите содержимое файла .tar.gz с веб-сайта в объект python 3.x

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

содержит файл обработан .pdf и .nxml копии статьи журнала. А также несколько файлов изображений.

Если я открою файл в своем браузере, скопировав и вставив его. Я могу сохранить в папку на моем компьютере, и импортировать файл обработан штраф, используя следующие команды (примечание: 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 файл непосредственно с веб-адреса? Заранее спасибо. Chris

ответ

9

К сожалению, вы не можете просто открыть файлы из сети. Здесь все сложнее. Вы должны указать интерпретатору создать сетевой запрос и создать объект, представляющий состояние запроса. Это можно сделать с помощью модуля 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.