Python脚本通过FTP上传文件


83

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

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

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

以及任何其他登录凭据。

Answers:


190

使用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()

ftplib.FTP_TLS如果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()将显示您当前所在的路径。
KZ 2012年

有一些奇怪的行为,我可以从命令行ftp到服务器并上传文件,但是不能使用ftplib,连接只是打开了一段时间,然后抛出了套接字错误。可能是什么原因 ?
89n3ur0n

16

ftplib现在支持上下文管理器,因此我想它可以变得更加简单

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)

无需关闭文件或会话


1
如果有人在使用接受的答案将文件从Windows上传到FTP服务器时遇到问题,则此方法对我有用。
mKane848

5

您很可能希望将ftplib模块用于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服务器。您在那里所做的一切取决于您。您的问题并不表示确实需要执行的任何其他操作。


塔德格,谢谢。我主要关心的是做一个简单的事情来登录我,并让我上传必要的文件。抱歉,我含糊不清。
沮丧的Python Coder

2
这不能回答问题
豪尔赫·雷涛

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()

4
问题是关于通过FTP而非SFTP传输文件。
Sam Hosseini

同意,SSHException: Error reading SSH protocol banner" when using ProxyCommand在ftp上执行此路由时通常会出错。
Benloper

0

我刚刚在这里回答了类似的问题 恕我直言,如果您的FTP服务器能够与Fabric通信,请与我们联系。这比干生要好得多ftp

我有一个FTP帐户,dotgeek.com因此我不确定这是否适用于其他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'

1
除非我在Fabrics文档中缺少某些内容,否则Fabric不支持FTP。您可能会遇到dotgeek.com使用相同凭据同时支持SSH和FTP的幸运情况。
Epcylon 2014年

@Epcylon Fabric支持SFTP-While the SFTP protocol (which put uses) 链接
Alex L

2
@AlexL正确,但是SFTP与FTP完全不同。出于相同的目的,它们是两种不同的协议,但是如果您需要连接到FTP服务器,则不能使用SFTP客户端,反之亦然。从Wikipedia:“ SFTP不是通过SSH运行的FTP,而是一种由IETF SECSH工作组重新设计的新协议。”
Epcylon 2014年

@Epcylon是的!只是想弄清楚Fabric的用途。希望OP(或将来的读者)可以通过SFTP进入其服务器,而不是使用FTP,结构非常方便。
Alex L

0

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

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()确保您的连接已加密


-1

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

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
Hrvoje T

@HrvojeT不要认为%f是必需的,因为它已设置为默认值。有关详细信息,请参见此ftpguide.com/STRU.htm
Debasish Mitra,

什么是远程的?
萨吉德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.