質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3871閲覧

ファイル転送時のパス指定について

430430Wt

総合スコア37

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2016/03/14 14:18

編集2016/03/14 22:22

ftpサーバにファイルを送るソースコードを作成しました。
def ftpget(host, username, password, getfile):
try:
_ftp = FTP(host, username, password)
_ftp.cwd("/log/")
_file = open(getfile, "wb")
command = "RETR " + getfile
_ftp.retrbinary(command, _file.write)
_file.close()
_ftp.quit()
except:
print "ftpget_failed :" + getfile

if name == 'main':
ftpput("192.168.0.10", "testuser", "testpass", "test.html")

上記のコードで、引数4にtest.htmlを指定しています。
これだと、ソースコードのディレクトリにtest.htmlがないとエラーとなってしまいます。

test.htmlではなく、dir = /var/tmp/test.txt
のように変数にしたいです。

どなたかご存知の方いらっしゃいますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

attakei

2016/03/15 00:31

記載されているコード内で定義している関数がftpgetに対して、ftpputを呼び出しているように見えます。 ftpputの定義も書いてみていただけますか
guest

回答1

0

ベストアンサー

初めまして。
すでに質問の修正依頼があるように、putを実行しているにもかかわらず、
記載されているコードがgetになっているため、
こちらで仮に想定したサンプルコードを使って、解説しますね。
的外れだったら、ゴメンなさい。

ソースコードのディレクトリにtest.htmlがないとエラーとなってしまいます。

これはどんなプログラムでも基本的に同様な動作だと思います。
特別にPythonだけではなく、実行する場所にもよりますが、基本的には、実行ファイルがある場所が実行環境でのルートディレクトリとなると思えばいいかと思います。

test.htmlではなく、dir = /var/tmp/test.txt

のように変数にしたいです。

今回の質問内容は、この変数部分だと思いましたので、
指定されたディレクトリにあるファイルを送信するサンプルコードを書いてみました。
以上を踏まえたうえで、下記のサンプルコードを見ていただき、参考になれば幸いです。

Python

1#!/usr/bin/env python 2# coding=utf-8 3############################# 4# FileName: test.py 5#. 6#├── test.py 7#└── var 8# └── tmp 9# └── test.txt 10############################# 11## improt 12from ftplib import FTP_TLS 13 14## variable 変数 15ftp_serveraddress = '192.168.0.10' 16ftp_user = 'testuser' 17ftp_password = 'testpass' 18ftp_putdir = './var/tmp/' 19ftp_putfile = 'test.txt' 20 21def ftpput(host, username, password, putdir, putfile): 22 try: 23 ftp_putdir = "/" 24 _putfile = '%s%s' % (putdir, putfile) 25 print _putfile 26 print "FTP Start." 27 # FTPの場合 28 # _ftp = FTP(host) 29 _ftps = FTP_TLS(host) 30 # デバックログの出力 (0:なし /1:コマンド /2:詳細) 31 _ftps.set_debuglevel(1) # デバッグログがリアルタイムで確認できます。 32 _ftps.login(username, password) 33 print _ftps.getwelcome() 34 print "Login OK! : %s" % (_ftps) 35 _ftps.cwd(ftp_putdir) 36 print "File Open." 37 _file = open(_putfile, 'rb') 38 command = 'STOR %s' % putfile 39 _ftps.storlines(command, _file) 40 _file.close() 41 print _ftps.quit() 42 print "File UP Complete!" 43 except: 44 _ftps.quit() 45 print "ERR!! ftpput_failed :" + _putfile 46 47if __name__ == '__main__': 48 ftpput(ftp_serveraddress, ftp_user, ftp_password, ftp_putdir, ftp_putfile)

参考リンク先:
20.8. ftplib — FTP protocol client

解説

今回のポイントは、指定ディレクトリと送信ファイルを個別の変数に分けたことです。

分ける理由としては、FTPの接続先へ送る際のコード_ftps.storlines(command, _file)で指定している「command」変数ですが、command = 'STOR %s' % putfileで送信ファイル名(受信側で作成されるファイル名)を指定しないといけないためです。

Python

1...省略 2ftp_putdir = './var/tmp/' 3ftp_putfile = 'test.txt' 4...省略 5_putfile = '%s%s' % (putdir, putfile) 6...省略 7_file = open(_putfile, 'rb') 8command = 'STOR %s' % putfile 9_ftps.storlines(command, _file) 10...省略 11if __name__ == '__main__': 12 ftpput(ftp_serveraddress, ftp_user, ftp_password, ftp_putdir, ftp_putfile)

以上です。
今回は、セキュリティなども考慮し書いてますので、「FTPS」通信方式を採用してます。
解決となれば幸いです。

投稿2016/03/15 15:25

-jL-

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問