import ftplib
import csv
import StringIO
sio = StringIO.StringIO()
data = csv.writer(sio)
data.writerows(data_to_export)
sio.seek(0)
ftps.storbinary("STOR " + 'blah.csv', sio)
ftps.close()
因此,我创建的文件只有56行,创建速度非常慢。当它完成创建时,我收到此错误:
ftps.storbinary("STOR " + 'blah.csv', sio)
File "/usr/lib/python2.7/ftplib.py", line 752, in storbinary
conn.unwrap()
File "/usr/lib/python2.7/ssl.py", line 384, in unwrap
s = self._sslobj.shutdown()
SSLError: The read operation timed out
我不明白为什么它如此缓慢以及为什么它会给出时间,即使它会创建该文件。
P.S。请询问我是否需要提供其他信息
更新
我也尝试了cString
,但它没有改进任何东西,因为我猜它与写入速度无关。
如果存在任何差异,则使用隐式SSL / TLS模式(ftp不支持显式SSL / TLS)建立与ftp的连接。
更新 深层发掘。这就是调试显示的ftp:
*cmd* 'TYPE I'
*resp* '200 Binary mode selected.'
*cmd* 'PASV'
*resp* '227 Entering Passive Mode (*,*,*,*,*,*)'
*cmd* 'STOR blah.csv'
*resp* '125 Secure data connection open; transfer starting.'
然后卡在最后一个输出上,直到我连接超时。
注意即可。我的互联网连接非常好,但是ftp有点慢。我仍然认为这样的小文件处理速度要快得多。
UPDATE2 这是一些奇怪的ftp。尝试不安全的ftp连接,文件正确且快速上传。隐式连接与这种缓慢的性能和超时有关。
答案 0 :(得分:0)
关于速度,有太多的因素无法猜测,所以我会调整代码并尝试以下代码,我最近为客户ftp交付创建并且可以说它没有错误。
请注意,这是来自一个更大的文件,但已提取相关部分,因此忽略一些变量,即args.var,您可能必须根据带宽调整块大小等尝试将其降低到1024然后处理。< / p>
希望有所帮助
def initiate_ftp_connection(ftp_host, user, passwd, ftp_dir):
ftp_session = ftplib.FTP()
ftp_session.connect(ftp_host, 21)
#uncomment for debugging.
#ftp_session.set_debuglevel(2)
ftp_session.login(user=user,
passwd=passwd)
#cd to correct remote directory
ftp_session.cwd(ftp_dir)
return ftp_session
def upload_deliverables(session, file_and_path):
working_dir = os.path.dirname(file_and_path)
#strip to remove any newlines
filename = os.path.basename(file_and_path).strip()
totalSize = os.path.getsize(file_and_path)
#instantiate progress tracker for status updates
uploadTracker = FtpUploadTracker(int(totalSize),filename)
#change dir to working_dir
os.chdir(working_dir)
'''
Trigger the ftp upload (storbinary) for the deliverable.
Args:
1: FTP KEYWORD and FILE
2: File IO
3: Blocksize
4: Callback
'''
session.storbinary('STOR ' + filename,
open(filename,'r'),
8192,
uploadTracker.ftp_callback)
#connect to server
ftp_session = initiate_ftp_connection(args.ftp_host,
args.ftp_user,
args.ftp_pass,
args.ftp_dir)
#start ftp delivery
upload_deliverables(ftp_session, args.asset)
#quit the ftp session
ftp_session.quit()
#close any file handles.
ftp_session.close()