python - 在 python 中通过 ftplib 上传比手动上传花费的时间要长得多

标签 python python-2.7 file-upload ftplib

所以,

由于某些原因,与通过 FTP 程序或通过网站本身上传相比,下面的一小段代码上传时间要长得多。

文件达到 600kb,通过 ftp 程序/直接通过网络最多需要 1-3 秒,但是通过 ftplib 需要 15-30 秒...慢了 15 倍以上

我正在上传的文件是单行 html/php 文件(缩小),有没有更快的上传方式...?

在我的实际代码中,我上传了 25 个以上的文件,所有文件的总大小最大为 1mb,是否有一种批量上传方法,其中 .tmp 重命名(部分阻止从加载更新页面)哪个更适合我?

import ftplib

print "Uploading FULL.html"
## Login using the ftplib library and set the session as the variable ftp_session
ftp_session = ftplib.FTP('ftp.website.com','admin@website.com','Password1','',60)
## Open a file to upload
ftp_file = open('OUTPUT/DATA/FULL.html','r')
## Open a folder in the ftp server
ftp_session.cwd("/DATA/")
## Send/upload the file to the ftp server
ftp_session.storlines('STOR FULL.html.tmp', ftp_file)
## Close the ftp_file
ftp_file.close()
## Rename temp file
ftp_session.rename("FULL.html.tmp", "FULL.html")

print "Uploading index.php"
## Open a file to upload
ftp_file = open('OUTPUT/index.php','r')
## Send/upload the file to the ftp server
ftp_session.storlines('STOR index.php.tmp', ftp_file)
## Close the ftp_file
ftp_file.close()
## Rename temp file
ftp_session.rename("index.php.tmp", "index.php")

print "Uploading secondary.php"
## Open a file to upload
ftp_file = open('OUTPUT/secondary.php','r')
## Send/upload the file to the ftp server
ftp_session.storlines('STOR secondary.php.tmp', ftp_file)
## Close the ftp_file
ftp_file.close()
## Rename temp file
ftp_session.rename("secondary.php.tmp", "secondary.php")

## Quit out of the FTP session
ftp_session.quit()

示例上传输出....

Running...
Uploaded MAIN.html (284KB) in 9.677 seconds at 29.40 kbps
Uploaded GROUP1.html (12KB) in 0.660 seconds at 19.12 kbps
Uploaded GROUP10.html (9KB) in 1.137 seconds at 8.07 kbps
Uploaded GROUP11.html (14KB) in 1.014 seconds at 14.56 kbps
Uploaded GROUP12.html (17KB) in 0.913 seconds at 18.87 kbps
Uploaded GROUP13.html (12KB) in 0.675 seconds at 18.66 kbps
Uploaded GROUP14.html (13KB) in 0.738 seconds at 18.54 kbps
Uploaded GROUP15.html (16KB) in 0.971 seconds at 16.53 kbps
Uploaded GROUP16.html (14KB) in 1.755 seconds at 8.44 kbps
Uploaded GROUP17.html (13KB) in 1.504 seconds at 9.05 kbps
Uploaded GROUP18.html (14KB) in 0.725 seconds at 20.47 kbps
Uploaded GROUP19.html (14KB) in 1.691 seconds at 8.76 kbps
Uploaded GROUP2.html (10KB) in 0.541 seconds at 18.90 kbps
Uploaded GROUP20.html (13KB) in 0.799 seconds at 16.69 kbps
Uploaded GROUP21.html (14KB) in 0.713 seconds at 20.42 kbps
Uploaded GROUP22.html (14KB) in 0.776 seconds at 18.61 kbps
Uploaded GROUP23.html (14KB) in 0.592 seconds at 24.99 kbps
Uploaded GROUP24.html (13KB) in 0.734 seconds at 18.86 kbps
Uploaded GROUP25.html (20KB) in 0.845 seconds at 24.49 kbps
Uploaded GROUP26.html (18KB) in 0.637 seconds at 28.91 kbps
Uploaded GROUP27.html (11KB) in 0.781 seconds at 14.54 kbps
Uploaded GROUP28.html (16KB) in 0.798 seconds at 20.25 kbps
Uploaded GROUP29.html (12KB) in 0.542 seconds at 23.46 kbps
Uploaded GROUP3.html (16KB) in 0.585 seconds at 27.47 kbps
Uploaded GROUP4.html (14KB) in 0.622 seconds at 23.97 kbps
Uploaded GROUP5.html (14KB) in 0.716 seconds at 20.54 kbps
Uploaded GROUP6.html (18KB) in 1.109 seconds at 16.48 kbps
Uploaded GROUP7.html (11KB) in 0.654 seconds at 17.52 kbps
Uploaded GROUP8.html (9KB) in 0.560 seconds at 16.25 kbps
Uploaded GROUP9.html (12KB) in 0.582 seconds at 21.42 kbps
The whole routine took 72.468 seconds

最佳答案

导致您的传输速度尽可能慢而应用程序发送速度更快的原因有多种:

  1. 您一次发送一行,ftp 应用程序将一次发送一个 8192 字节的 block ,
  2. 您正在以文本模式发送,应用程序可能正在以二进制压缩模式发送,

除非行尾有问题,否则使用 open(filename, "rb") 然后 tp_session.storbinary('STOR index.php.tmp', ftp_file)您也可以尝试发送命令 'MODE COMPRESSED' 并检查回复,然后您可以调整 block 大小以找到最佳值。

我要设置的另一件事是:

import glob, os, ftplib
from time import time

sourcedir = '/where/your/files/are/locally'
destdir = '/where/to/put/them'
##    filelist = ['file2.ext', 'file2.ext', 'etc']
filelist = glob.glob(os.path.join(sourcedir, '*.php'))

ftp_session = ftplib.FTP('ftp.website.com','admin@website.com','password123','',60)
ftp_session.cwd(destdir)

for fname in filelist:
    filename = fname.replace(sourcedir+'\\', "")
    ftp_file = open(fname,'rb')
    result = ftp_session.storbinary('STOR %s.tmp' % filename, ftp_file)
    ftp_file.close()
    if 199 < int(result[0:3]) < 300: # Positive Completion
        ftp_session.rename('%s.tmp' % filename, filename)
    else:
        print "Upload of %s resulted in code %s" % (filename, result)
        break

您可以将文件压缩或 tar.gz 并发送,但您需要安全的套接字连接和适当的权限才能单独解压缩。

关于python - 在 python 中通过 ftplib 上传比手动上传花费的时间要长得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20660576/

相关文章:

Python将文件从远程机器移动到本地

Python 电子邮件标题奇怪的行为

asp.net - context.Request.Files 集合仅在远程服务器上为空

file-upload - 如何为 Alfresco 4.2.c 中上传的文件设置大小限制?

python - 如果 Django 中已存在文件,则完全阻止文件上传

python - python 包的 bitbake 配方不起作用

python - 在 Matplotlib 中,有没有办法知道可用输出格式的列表

python - pyspark - 将 .csv 文件从 url 加载到 Spark 时出错

python - 有条件地删除重复项 pandas python

python - Pandas :从字符串中删除编码