【问题标题】:Python Script Uploading files via FTPPython脚本通过FTP上传文件
【发布时间】:2012-09-18 18:59:33
【问题描述】:

我想编写一个脚本来将文件上传到 FTP。

登录系统如何工作?我正在寻找这样的东西:

ftp.login=(mylogin)
ftp.pass=(mypass)

以及任何其他登录凭据。

【问题讨论】:

    标签: python ftp upload


    【解决方案1】:

    您很可能希望使用ftplib module for python

     import ftplib
     ftp = ftplib.FTP()
     host = "ftp.site.uk"
     port = 21
     ftp.connect(host, port)
     print (ftp.getwelcome())
     try:
          print ("Logging in...")
          ftp.login("yourusername", "yourpassword")
     except:
         "failed to login"
    

    这会将您登录到 FTP 服务器。你从那里做什么取决于你。您的问题并未表明任何其他真正需要做的操作。

    【讨论】:

    • 塔德,谢谢。我主要关心的是做一个简单的事情让我登录,让我上传必要的文件。很抱歉这么含糊。
    • 这不能回答问题
    【解决方案2】:

    使用ftplib,可以这样写:

    import ftplib
    session = ftplib.FTP('server.address.com','USERNAME','PASSWORD')
    file = open('kitten.jpg','rb')                  # file to send
    session.storbinary('STOR kitten.jpg', file)     # send the file
    file.close()                                    # close file and FTP
    session.quit()
    

    如果您的 FTP 主机需要 TLS,请改用 ftplib.FTP_TLS


    要找回它,你可以使用urllib.retrieve:

    import urllib 
    
    urllib.urlretrieve('ftp://server/path/to/file', 'file')
    

    编辑

    要查找当前目录,请使用FTP.pwd()

    FTP.pwd():返回服务器上当前目录的路径名。

    要更改目录,请使用FTP.cwd(pathname):

    FTP.cwd(pathname):设置服务器上的当前目录。

    【讨论】:

    • @DawsonHensel 您可以使用print ftp.pwd() 将显示您当前所在的路径。
    • 有一些奇怪的行为,我可以从命令行 ftp 到我的服务器并上传文件但不能使用 ftplib ,连接只是打开了一段时间然后抛出套接字错误。可能是什么原因?
    • 您好,我想知道是否可以使用 ftplib 上传文件夹
    【解决方案3】:

    我刚刚回答了一个类似的问题here 恕我直言,如果您的 FTP 服务器能够与 Fabric 通信,请使用 Fabric。这比做原始的ftp要好得多。

    我有一个来自 dotgeek.com 的 FTP 帐户,所以我不确定这是否适用于其他 FTP 帐户。

    #!/usr/bin/python
    
    from fabric.api import run, env, sudo, put
    
    env.user = 'username'
    env.hosts = ['ftp_host_name',]     # such as ftp.google.com
    
    def copy():
        # assuming i have wong_8066.zip in the same directory as this script
        put('wong_8066.zip', '/www/public/wong_8066.zip')
    

    将文件另存为fabfile.py 并在本地运行fab copy

    yeukhon@yeukhon-P5E-VM-DO:~$ fab copy2
    [1.ai] Executing task 'copy2'
    [1.ai] Login password: 
    [1.ai] put: wong_8066.zip -> /www/public/wong_8066.zip
    
    Done.
    Disconnecting from 1.ai... done.
    

    再一次,如果你不想一直输入密码,只需添加

    env.password = 'my_password'
    

    【讨论】:

    • 除非我在fabric 文档中遗漏了一些东西,否则fabric 不支持FTP。您可能很幸运,dotgeek.com 使用相同的凭据同时支持 SSH 和 FTP。
    • @Epcylon Fabric 支持 SFTP - While the SFTP protocol (which put uses) link
    • @AlexL 正确,但 SFTP 在任何方面都与 FTP 不同。它们是出于相同目的的两种不同协议,但是如果您需要连接到 FTP 服务器,则不能使用 SFTP 客户端,反之亦然。来自wikipedia:“SFTP 不是通过 SSH 运行的 FTP,而是而是由 IETF SECSH 工作组从头开始设计的新协议。”
    • @Epcylon 是的!只是想澄清一下 Fabric 的用途。希望 OP(或未来的读者)可以 SFTP 到他们的服务器而不是使用 FTP,fabric 非常方便。
    【解决方案4】:

    试试这个:

    #!/usr/bin/env python
    
    import os
    import paramiko 
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('hostname', username="username", password="password")
    sftp = ssh.open_sftp()
    localpath = '/home/e100075/python/ss.txt'
    remotepath = '/home/developers/screenshots/ss.txt'
    sftp.put(localpath, remotepath)
    sftp.close()
    ssh.close()
    

    【讨论】:

    • 问题是关于通过 FTP 传输文件,而不是 SFTP。
    • 同意,在ftp上走这条路线时经常得到SSHException: Error reading SSH protocol banner" when using ProxyCommand错误。
    【解决方案5】:

    您可以使用以下功能。我还没有测试它,但它应该可以正常工作。记住目标是目录路径,源是完整的文件路径。

    import ftplib
    import os
    
    def uploadFileFTP(sourceFilePath, destinationDirectory, server, username, password):
        myFTP = ftplib.FTP(server, username, password)
        if destinationDirectory in [name for name, data in list(remote.mlsd())]:
            print "Destination Directory does not exist. Creating it first"
            myFTP.mkd(destinationDirectory)
        # Changing Working Directory
        myFTP.cwd(destinationDirectory)
        if os.path.isfile(sourceFilePath):
            fh = open(sourceFilePath, 'rb')
            myFTP.storbinary('STOR %s' % f, fh)
            fh.close()
        else:
            print "Source File does not exist"
    

    【讨论】:

    • myFTP.storbinary('STOR %s' % f, fh) % f 是什么?
    • @HrvojeT 不要认为 % f 是必需的,因为它被设置为默认值。详情见ftpguide.com/STRU.htm
    • 什么是远程?
    【解决方案6】:

    ftplib 现在supports context managers 所以我想它可以变得更容易

    from ftplib import FTP
    from pathlib import Path
    
    file_path = Path('kitten.jpg')
    
    with FTP('server.address.com', 'USER', 'PWD') as ftp, open(file_path, 'rb') as file:
            ftp.storbinary(f'STOR {file_path.name}', file)
    

    无需关闭文件或会话

    【讨论】:

    • 如果有人在使用接受的答案将文件从 Windows 上传到 FTP 服务器时遇到问题,这种方法对我有用。
    • 我在使用它来覆盖/更新远程 FTP 服务器上的二进制文件时确实遇到了问题 - 但它适用于通过 ftp.storlines 处理的文本文件 ...
    【解决方案7】:

    为避免出现加密错误,您还可以尝试以下命令

    ftp = ftplib.FTP_TLS("ftps.dummy.com")
    ftp.login("username", "password")
    ftp.prot_p()
    file = open("filename", "rb")
    ftp.storbinary("STOR filename", file)
    file.close()
    ftp.close()
    

    ftp.prot_p() 确保您的连接是加密的

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      相关资源
      最近更新 更多