2017-02-01 5 views
0

Я пытаюсь загрузить файл из tar-файла на ftp-сервере. аналогично этому Read contents of .tar.gz file from website into a python 3.x object, когда я иду, чтобы открыть файл обработан я получаю Ошибка чтения (ниже)открытие tarfile с ftp-сайта с использованием python с использованием tarfile и urllib

ftpURL = u'ftp://ftpprd.ncep.noaa.gov/pub/data/nccf/com/wave/prod/multi_1.20170201/multi_1.t00z.spec_tar.gz' 
ftpstream = urllib.urlopen(ftpURL) 
tar = tarfile.open(fileobj=ftpstream, mode='r|bz2') # here's where i get the error 
Traceback (most recent call last): 
    File "C:\Anaconda2\lib\site-packages\IPython\core\interactiveshell.py", line 2885, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-20-c3e97355618c>", line 1, in <module> 
    tar = tarfile.open(fileobj=ftpstream, mode='r|bz2') 
    File "C:\Anaconda2\lib\tarfile.py", line 1703, in open 
    t = cls(name, filemode, stream, **kwargs) 
    File "C:\Anaconda2\lib\tarfile.py", line 1587, in __init__ 
    self.firstmember = self.next() 
    File "C:\Anaconda2\lib\tarfile.py", line 2355, in next 
    tarinfo = self.tarinfo.fromtarfile(self) 
    File "C:\Anaconda2\lib\tarfile.py", line 1251, in fromtarfile 
    buf = tarfile.fileobj.read(BLOCKSIZE) 
    File "C:\Anaconda2\lib\tarfile.py", line 579, in read 
    buf = self._read(size) 
    File "C:\Anaconda2\lib\tarfile.py", line 598, in _read 
    raise ReadError("invalid compressed data") 
ReadError: invalid compressed data 

я упускаю что-то с размером буфера? Если это так, не знакомы с размером буфера, где я найду конкретную информацию о размере необходимого буфера, я должен удвоить и утроить размер безрезультатно. Я также пробовал несколько файлов. Я могу загрузить файл вручную и открыть его на моей машине .... любая помощь очень ценится

ответ

0

Присмотритесь на подпись:

tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs) 

и описание:

Если задано, fileobj может быть любым объектом, который имеет метод read() или write() (в зависимости от режима). bufsize указывает размер блока и по умолчанию - 20 * 512 байтов. Используйте этот вариант в комбинации с, например, sys.stdin, файл файла сокета или ленточное устройство. Однако такой объект TarFile ограничен тем, что он не позволяет осуществлять произвольный доступ, см. Примеры .

Что ты хотел сделать, это:

tar = tarfile.open(fileobj=ftpstream, mode='r|bz2') 
+0

Спасибо, я видел это. Однако моя проблема все еще не решена. Я редактировал сообщение с новыми проблемами. – SBFRF

+0

Изменение вашего сообщения каждый раз, когда ваша проблема изменяется, когда вы пытаетесь переустановить исправление, это не то, как работает stackoverflow. – TkTech

+0

well @TkTech Извините, если моя методология не так, как вы бы предпочли, как бы вы предложили мне найти решение для моей проблемы? – SBFRF

Смежные вопросы