作为一个仍在学习该语言的 python 新手,我挣扎了几天尝试使用 ftplib 中的 ftp 类(运行 Python 3.3)进行简单的 ASCII 文件传输(STOR/PUT)。
在使用 storbinary() 方法并不断收到 TypeError: "Type str doesn't support the buffer API" 之后,我发现了这个线程上的讨论,这意味着 ftplib 到 Python 3 的端口存在错误:
http://bugs.python.org/issue6822
然后我尝试使用 storbinary() 而不是 storlines(),使用使用“rb”开关打开的文件对象,它似乎工作得很好。我正在使用 Windows 系统,出于测试/学习的目的,我正在上传到我自己位于 Linux 主机上的站点。在上传 .zip 和 .txt 文件并使用 FileZilla 将它们复制回我的工作站后,这两个文件都完好无损。
在我的日常工作中,我需要将 gzipped 和 ASCII 文件上传到大型机,并且担心使用这种违反直觉的解决方法可能会让自己面临文件传输错误。当忘记切换到适当的传输模式时,我搞砸了很多手动 FTP 传输,能够使用完全相同的代码传输二进制文件和 ASCII 文件感觉令人毛骨悚然!
谁能评论我是如何实现这个库类的?
谢谢。
fileName = 'F:\\Data_Folder\\Test_File.txt'
fileParts = os.path.split(fileName)
putFile = fileParts[1]
cmd = 'STOR {}'.format(putFile)
fileObject = open(fileName, 'rb')
ftp.storbinary(cmd, fileObject)
fileName = 'F:\\Data_Folder\\Test_File.zip'
fileParts = os.path.split(fileName)
putFile = fileParts[1]
cmd = 'STOR {}'.format(putFile)
fileObject = open(fileName, 'rb')
ftp.storbinary(cmd, fileObject)
2013 年 6 月 28 日 - 回到这里是为了在这个问题上“闭环”。虽然我可以将 open(fileName, 'rb') 与 ftp.storbinary() 一起成功用于二进制和 ASCII 文本文件,并将 Windows 和 Linux 主机作为目标,但当我以大型机作为目标这样做时,文本文件出现乱码,显示为二进制文件。
通过向我的包装类添加一个开关以继续使用“rb”参数打开文件,但使用 storlines() 代替进行传输,文件将完好无损地到达目的地。我敢打赌,大型机端可能有一些配置选项可能使这种行为因一台主机而异,但我希望提及这一点会提醒遇到此线程的任何人注意“显然”的可能性安全”的 open(fileName, 'rb') 和 storbinary() 组合可能无法在所有 FTP 主机上成功,尤其是大型机系统。它可能只能通过反复试验来确定,但在某些情况下,传输 ASCII 数据的正确方法将需要 open(fileName, 'rb') 和 storlines()。