【问题标题】:FTP upload files PythonFTP上传文件Python
【发布时间】:2013-06-30 13:24:57
【问题描述】:

我正在尝试将文件从 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 上传文件。

【问题讨论】:

    标签: python ftp


    【解决方案1】:

    尝试将文件设为对象,以便在操作结束时将其关闭。

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

    在传输结束时

     myfile.close()
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      如果您打算使用 ftp 库,您可能应该阅读教程,我推荐来自 effbot 的 article

      【讨论】:

      • MyFile.py 的内容不会被删除。但我仍然在尝试错误。
      • 使用 storlines 假定 myfile 是一个文本文件。对于其他文件(图像、电影、档案,基本上是您无法在文本编辑器中打开和阅读的任何内容),您应该使用 storbinary 并使用 'rb' 而不是仅使用 'r 打开文件
      • 根据bugs.python.org/issue6822,非二进制文件也应该用'rb'标志打开,但之后仍然用storlines()上传。刚刚遇到了“r”的问题,并且提供的链接的“类型 str 不支持缓冲区 AP”异常。
      【解决方案3】:

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

      #!/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()
      

      【讨论】:

      • 使用 storlines 假定 myfile 是一个文本文件。对于其他文件(图像、电影、档案,基本上是任何您无法在文本编辑器中打开和阅读的文件),您应该使用 storbinary 并使用“rb”打开文件,而不仅仅是“r”
      • 至少在当前版本中,需要以二进制模式('rb')打开文件才能发送,否则会报错。编辑:没有意识到有人已经说过这个^
      【解决方案4】:

      ftplib supports the use of context managers 所以你可以让它变得更简单

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

      这样您就可以应对文件和 ftp 问题,而无需插入 try/except/finally 块。好吧,它是 pythonic。

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

      【讨论】:

        猜你喜欢
        • 2012-09-18
        • 2013-04-30
        • 2012-03-12
        • 2012-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多