Python将文件读入内存以进行重复的FTP复制

RAF*_*FIQ 0 python windows ftp

我需要读取本地文件并使用 FTP 复制到远程位置,我使用不同的名称(如 f1.txt、f2.txt...f1000.txt 等)将同一文件 file.txt 重复复制到远程位置数百次。现在,是否有必要始终为每个 FTP 副本打开、读取、关闭我的本地 file.txt,或者是否有办法将其存储到变量中并始终使用它,并避免文件打开、关闭功能。file.txt是6KB的小文件。下面是我正在使用的代码

for i in range(1,101):
    fname = 'file'+ str(i) +'.txt'
    fp = open('file.txt', 'rb')
    ftp.storbinary('STOR ' + fname, fp)
    fp.close()
Run Code Online (Sandbox Code Playgroud)

我尝试读取字符串变量并替换 fp 但 ftp.storbinary 需要第二个参数才能具有方法 read(),请建议是否有更好的方法来避免文件打开关闭,或者让我知道它是否根本没有性能改进。我在 Windows 7 上使用 python 2.7.10。

Dee*_*ace 5

只需在循环之前打开它,然后在循环之后关闭它:

fp = open('file.txt', 'rb')

for i in range(1,101):
    fname = 'file'+ str(i) +'.txt'
    fp.seek(0)
    ftp.storbinary('STOR ' + fname, fp)

fp.close()  
Run Code Online (Sandbox Code Playgroud)

更新确保fp.seek(0)在调用之前添加ftp.storbinary,否则read调用将在第一次迭代中耗尽文件,如 @eryksun 所指出的。

更新 2根据文件的大小,使用起来可能会更快BytesIO。这样,文件内容保存在内存中,但仍然是一个类似文件的对象(即它将有一个read方法)。

from io import BytesIO

with open('file.txt', 'rb') as f:
    output = BytesIO()
    output.write(f.read())

for i in range(1, 101):
    fname = 'file' + str(i) + '.txt'
    output.seek(0)
    ftp.storbinary('STOR ' + fname, fp)
Run Code Online (Sandbox Code Playgroud)

  • 您缺少“fp.seek(0)”来将文件指针重置到开头。 (5认同)