FTP経由でファイルをアップロードするPythonスクリプト


83

FTPにファイルをアップロードするスクリプトを作成したいと思います。

ログインシステムはどのように機能しますか?私はこのようなものを探しています:

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

およびその他のサインイン資格情報。

回答:


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_TLSFTPホストに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 2015年

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

Python用のftplibモジュールを使用することをお勧めします

 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サーバーにログインします。そこから何をするかはあなた次第です。あなたの質問は、本当に実行する必要のある他の操作を示していません。


Tadgh、ありがとう。私が抱えている主な関心事は、私をログインさせ、必要なファイルをアップロードさせる簡単なものを作ることです。あいまいでごめんなさい。
欲求不満のPythonコーダー2012

2
これは質問に答えません
JorgeLeitao19年

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
質問は、SFTPではなくFTP経由でファイルを転送することです。
Sam Hosseini 2016年

同意しました。ftpでSSHException: Error reading SSH protocol banner" when using ProxyCommandこのルートを使用するとエラーが発生することがよくあります。
ベンローパー2017

0

私はここで同様の質問に答えました 。FTPサーバーがFabricと通信できる場合は、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
ファブリックのドキュメントに何かが欠けていない限り、ファブリックはFTPをサポートしていません。dotgeek.comが同じ資格情報を使用してSSHとFTPの両方をサポートしているという幸運な状況にいる可能性があります。
エプサイロン2014年

@EpcylonファブリックはSFTPをサポートします-While the SFTP protocol (which put uses) リンク
Alex L

2
@AlexL正解ですが、SFTPはFTPとまったく同じではありません。これらは同じ目的のための2つの異なるプロトコルですが、FTPサーバーに接続する必要がある場合、SFTPクライアントを使用することはできません。その逆も同様です。ウィキペディアから:「SFTPはSSH経由で実行されるFTPではなく、 IETFSECSHワーキンググループによってゼロから設計された新しいプロトコル。」
エプサイロン2014

@Epcylonうん!Fabricが何を使用しているかを明確にしようとしているだけです。うまくいけば、OP(または将来のリーダー)はFTPを使用するのではなく、サーバーにSFTPで接続できます。ファブリックは非常に便利です。
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

リモートとは何ですか?
sajid
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.