14

我正在尝试将文件从 Windows 服务器上传到 unix 服务器(基本上是尝试做 FTP)。我使用了下面的代码

#!/usr/bin/python
import ftplib
import os
filename = "MyFile.py"
ftp = ftplib.FTP("xx.xx.xx.xx")
ftp.login("UID", "PSW")
ftp.cwd("/Unix/Folder/where/I/want/to/put/file")
os.chdir(r"\\windows\folder\which\has\file")
ftp.storbinary('RETR %s' % filename, open(filename, 'w').write)

我收到以下错误:

Traceback (most recent call last):
  File "Windows\folder\which\has\file\MyFile.py", line 11, in <module>
    ftp.storbinary('RETR %s' % filename, open(filename, 'w').write)
  File "windows\folder\Python\lib\ftplib.py", line 466, in storbinary
    buf = fp.read(blocksize)
AttributeError: 'builtin_function_or_method' object has no attribute 'read'

的所有内容也MyFile.py被删除了。

谁能告诉我出了什么问题。我读过 ftp.storbinary 用于使用 FTP 上传文件。

4

4 回答 4

17

如果您尝试存储非二进制文件(如文本文件),请尝试将其设置为读取模式而不是写入模式。

ftp.storlines("STOR " + filename, open(filename, 'rb'))

对于二进制文件(任何无法在文本编辑器中打开的文件)以读取二进制模式打开文件

ftp.storbinary("STOR " + filename, open(filename, 'rb'))

另外,如果您打算使用 ftp lib,您可能应该阅读教程,我会推荐 effbot 的这篇文章

于 2013-07-03T01:06:02.270 回答
9

结合了这两个建议。最终答案是

#!/usr/bin/python
import ftplib
import os
filename = "MyFile.py"
ftp = ftplib.FTP("xx.xx.xx.xx")
ftp.login("UID", "PSW")
ftp.cwd("/Unix/Folder/where/I/want/to/put/file")
os.chdir(r"\\windows\folder\which\has\file")
myfile = open(filename, 'r')
ftp.storlines('STOR ' + filename, myfile)
myfile.close()
于 2013-07-03T01:18:32.673 回答
3

尝试使文件成为对象,这样您就可以在操作结束时将其关闭。

myfile = open(filename, 'w')
ftp.storbinary('RETR %s' % filename, myfile.write)

并在传输结束时

 myfile.close()

这可能无法解决问题,但可能会有所帮助。

于 2013-07-03T00:59:58.423 回答
0

ftplib 支持使用上下文管理器,因此您可以使其更简单

    with ftplib.FTP('ftp_address', 'user', 'pwd') as ftp, open(file_path, 'rb') as file:
        ftp.storbinary(f'STOR {file_path.name}', file)
        ...

通过这种方式,您无需插入 try/except/finally 块即可对文件和 ftp 问题保持稳健。好吧,它是pythonic。

PS:因为它使用 f-strings 只是 python >= 3.6 但可以很容易地修改为使用旧的 .format() 语法

于 2019-05-05T10:04:48.590 回答