загрузка пустого файла в ftp с помощью psuedo-файла - PullRequest
1 голос
/ 14 сентября 2010

Насколько я знаю, невозможно создать пустой файл с помощью ftp, вы должны создать пустой файл на локальном диске, загрузить его, а затем удалить, когда вы закончите.Мне было интересно, возможно ли сделать что-то вроде:

class FakeFile:
    def read(self):
        return '\x04'

ftpinstance.storbinary('stor fe', FakeFile())

Я подумал, что это может сработать, потому что документы для storbinary говорят, что он берет объект с методом read и вызывает его, пока не вернет EOFи \ x04 является символом ASCII EOF.Я попробовал это, хотя, и файл в конечном итоге на сервере, случайное число килобайт.Я что-то неправильно понимаю?

Ответы [ 3 ]

4 голосов
/ 14 сентября 2010

Нет необходимости реализовывать свой собственный файловый класс, просто используйте файлы в памяти встроенного модуля StringIO (или BytesIO в Python 3):

import ftplib
import cStringIO

ftp = ftplib.FTP('ftp.example.com')
ftp.login('user', 'pass')

voidfile = cStringIO.StringIO('')
ftp.storbinary('STOR emptyfile.foo', voidfile)

ftp.close()
voidfile.close()
2 голосов
/ 14 сентября 2010

Конец файла не является ASCII 4 в современном использовании.Это устаревшее использование со времен XMODEM и телетайпа.Попробуйте это:

class FakeFile:
    def read(self, size=0):
        return ''

, поскольку пустое чтение EOF.

С вашим текущим кодом вы должны получить файл произвольной длины, состоящий полностью из '\x04' символов.Это потому, что кажется, что всегда есть данные при чтении.^ _-

0 голосов
/ 14 сентября 2010

На самом деле документ гласит «читает до EOF».Я решил это, заставив функцию чтения вернуть пустую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...