هل يمكنني تحميل كائن في الذاكرة إلى FTP باستخدام Python؟
سؤال
هذا ما أفعله الآن:
mysock = urllib.urlopen('http://localhost/image.jpg')
fileToSave = mysock.read()
oFile = open(r"C:\image.jpg",'wb')
oFile.write(fileToSave)
oFile.close
f=file('image.jpg','rb')
ftp.storbinary('STOR '+os.path.basename('image.jpg'),f)
os.remove('image.jpg')
يبدو أن كتابة الملفات إلى القرص ثم حذفها على الفور يبدو وكأنه عمل إضافي على النظام الذي يجب تجنبه. هل يمكنني تحميل كائن في الذاكرة إلى FTP باستخدام Python؟
المحلول
بسبب بطة, كائن الملف (f
في الكود الخاص بك) يحتاج فقط لدعم .read(blocksize)
دعوة للعمل مع storbinary
. عندما أواجه أسئلة كهذه ، أذهب إلى المصدر ، في هذه الحالة lib/python2.6/ftplib.py:
def storbinary(self, cmd, fp, blocksize=8192, callback=None):
"""Store a file in binary mode. A new port is created for you.
Args:
cmd: A STOR command.
fp: A file-like object with a read(num_bytes) method.
blocksize: The maximum data size to read from fp and send over
the connection at once. [default: 8192]
callback: An optional single parameter callable that is called on
on each block of data after it is sent. [default: None]
Returns:
The response code.
"""
self.voidcmd('TYPE I')
conn = self.transfercmd(cmd)
while 1:
buf = fp.read(blocksize)
if not buf: break
conn.sendall(buf)
if callback: callback(buf)
conn.close()
return self.voidresp()
كما علق ، فهي تريد فقط كائن يشبه الملف, ، في الواقع ، لا يشبه الملف بشكل خاص ، فهو يحتاج فقط read(n)
. Stringio يوفر خدمات "ملف الذاكرة" هذه.
نصائح أخرى
import urllib
import ftplib
ftp = ftplib.FTP(...)
f = urllib.urlopen('http://localhost/image.jpg')
ftp.storbinary('STOR image.jpg', f)
يمكنك استخدام أي ذاكرة كائن يشبه الملف, ، مثل BytesIO
:
from io import BytesIO
يعمل في الوضع الثنائي مع FTP.storbinary
:
f = BytesIO(b"the contents")
ftp.storbinary("STOR /path/file.txt", f)
وكذلك في وضع ASCII/النص مع FTP.storlines
:
f = BytesIO(b"the contents")
ftp.storlines("STOR /path/file.txt", f)
للحصول على أمثلة أكثر تقدمًا ، انظر:
لا تنتمي إلى StackOverflow