Проблема с захватом и сохранением изображений в Python FTP - PullRequest
2 голосов
/ 26 мая 2010

РЕДАКТИРОВАТЬ: Я получил это работает, он просто не будет ничего скачивать ...

Итак, теперь мой код упрощен:

notions_ftp = ftplib.FTP(ftp_host, ftp_user, ftp_passwd)
folder = "Leisure Arts - Images"
notions_ftp.cwd(folder)
image = open("015693PR-com.jpg","wb")
notions_ftp.retrlines("RETR 015693PR-com.jpg", image.write)
send_image = open("015693PR-com.jpg", 'r')

А вот мой вывод:

'250 "/Leisure Arts - Images": is current directory.'
'226 Transfer complete. 0 bytes in 0.00 sec. (0.000 Kb/s)'

Исходное сообщение: Хорошо, так что я возился с этим весь день. Я довольно плохо знаком с Python FTP. Итак, я искал здесь и пришел с этим:

images = notions_ftp.nlst()
    for image_name in image_names:
        if found_url == False:
            try:
                for image in images:
                    ftp_image_name = "./%s" % image_name
                    if ftp_image_name == image:
                        found_url = True
                        image_name_we_want = image_name
            except:
                pass

    # We failed to find an image for this product, it will have to be done manually
    if found_url == False:
        log.info("Image ain't there baby -- SKU: %s" % sku)
        return False
    # Hey we found something! Open the image....
    notions_ftp.retrlines("RETR %s" % image_name_we_want, open(image_name_we_want, "rb"))
    1/0

Итак, я сузил ошибку до линии, прежде чем делить на ноль. Вот ошибка:

Traceback (most recent call last):
  File "<console>", line 6, in <module>
  File "<console>", line 39, in insert_image
IOError: [Errno 2] No such file or directory: '411483CC-IT,IM.jpg'

Так что, если вы будете следовать коду, вы увидите, что изображение находится в каталоге, потому что image_name_we_want установлено, если найдено в этом каталоге, перечисленном в первой строке моего кода. И я ЗНАЮ, что он там, потому что я сам смотрю на FTP-сайт и ... он там чёрт возьми. Так что в какой-то момент во время всего этого я получил изображение для локального сохранения, что является наиболее желательным, но я давно забыл, что я использовал для этого. В любом случае, почему он считает, что изображение не существует, когда оно явно находит его в списке.

ОК, поэтому я принял предложение, и теперь я получаю:

14:01:18,057 ERROR [pylons-admin] Image to big or corrupt! Skipping Image for product sku: 411483
14:01:18,057 ERROR [pylons-admin] Image to big or corrupt! Skipping Image for product sku: 411483
Traceback (most recent call last):
  File "<console>", line 6, in <module>
  File "<console>", line 40, in insert_image
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/ftplib.py", line 418, in retrlines
    callback(line)
TypeError: 'file' object is not callable
>>> 14:01:24,694 INFO  [pylons-admin] Script Done! Updated 0 Products w/ Images

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

# Hey we found something! Open the image....
    f = open(image_name_we_want, "wb")
    notions_ftp.retrlines("RETR %s" % image_name_we_want, f)
    send_image = open(image_name_we_want, 'r')

    # ...and send it for processing
    try:
        image_id = product_obj.set_image(send_image, 5, 1)
    except IOError, error:
        log.error("Image to big or corrupt! Skipping Image for product sku: %s" % sku)
        image_id = False
    else:
        if image_id == False:
            log.error("Could not Insert the image for product sku: %s" % sku)
            f.close()
            return False
        else:
            f.close()
            os.remove(image_name_we_want)
            return True

1 Ответ

1 голос
/ 26 мая 2010

Вы читаете файл вместо того, чтобы писать.

Поэтому вместо open(image_name_we_want, "rb") используйте open(image_name_we_want, "wb")

[править] Если вы просто загружаете данные с ftp-сервера, попробуйте следующее:

import urllib2
fh = urllib2.urlopen('ftp://server/path/file.png')
file('file.png', 'wb').write(fh.read())

Также, для полностью рабочего примера прочитайте это: http://docs.python.org/library/ftplib.html

Вы также пропускаете write после open()

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