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上传文件的主要内容,如果未能解决你的问题,请参考以下文章