Python脚本通过FTP上传文件

Posted

技术标签:

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

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

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

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

以及任何其他登录凭据。

【问题讨论】:

【参考方案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() 确保您的连接是加密的

【讨论】:

以上是关于Python脚本通过FTP上传文件的主要内容,如果未能解决你的问题,请参考以下文章

python ftp操作脚本&常用函数

用python写测试脚本,从本地传文件至ftp远程路径

python FTP自动下载,自动上传脚本,可以递归目录操作

FTP实时更新上传脚本

python网络编程socket模块实现ftp上传下载

我无法通过批处理脚本将多个文件上传到FTP