2016-08-16 90 views
0

私は自分のサーバーから毎日のFTP転送を自動化しようとしているPythonスクリプトを書いています。私はいくつかのファイルとファイルの種類(html、mp3、png、jpgなど)でスクリプトをテストしましたが、これまでのところすべてうまくいくようです。 しかし、単純なテキストファイル 'file.txt'(9 KB)をダウンロードしようとすると、ダウンロードは失敗しますが、テキストファイルを考慮していますが、転送のためにバイナリモードからテキストモードに切り替わります。次の例外がftplibのでスローされます。Python ftplib.error_perm 550:そのようなファイルやディレクトリはありませんか?

ftplib.error_perm: 550 file.txt: No such file or directory 

ここに私のスクリプトです:

from ftplib import FTP_TLS, error_perm 
import os 


def open_connection(server, user, pwd, work_dir=None): 
    global ftps 
    try: 
     ftps = FTP_TLS(host=server) 
     ftps.login(user=user, passwd=pwd) 
     ftps.prot_p() # switch to secure data connection 
     if work_dir != None: 
      ftps.cwd(work_dir) 
     else: 
      pass 
    except: 
     pass  


def download_file(remote_path, local_path): 
    remote_file = os.path.basename(remote_path) 
    local_file_path = os.path.join(local_path, remote_file) 

    # differentiate between text and binary files 
    file_type, encoding = guess_type_and_encoding(remote_file) 

    # possibly needs a permission exception catch 
    if file_type.split("/")[0] == "text" and encoding == None: 
     # use text mode for transfer 
     local_file = open(local_file_path, 'w') 
     def callback(line): local_file.write(line + "\n") 
     ftps.retrlines("RETR " + remote_file, callback) 
     local_file.close() 

    else: 
     # use binary mode for transfer 
     local_file = open(local_file_path, 'wb') 
     ftps.retrbinary("RETR " + remote_file, local_file.write) 
     local_file.close() 
    return 


def guess_type_and_encoding(filename): 
    from mimetypes import guess_type, add_type 
    add_type('text/x-python-win', '.pyw') # not in tables 
    mimetype, encoding = guess_type(filename, False) # allow extras 
    mimetype = mimetype or "?/?" # type unknown 
    return mimetype, encoding 


open_connection(server, user, pwd, work_dir) 
download_file("/files/dir/file.txt", "/Users/username/Desktop") 
ftps.close() 

エラーが発生した理由を私は得ることはありません!引数 'remote_path'と 'local_path'は正しく提供されています。どちらのパスも存在します! OS X上の私のデスクトップに「file.txtを」下/ファイル/ディレクトリサーバー上に存在し、/ユーザ/ユーザ名/デスクトップポイント

は、ここで詳細なftplibのエラーです:

Traceback (most recent call last): 
    File "ftp2.py", line 138, in <module> 
     download_file("/files/dir/file.txt", "/Users/username/Desktop") 
    File "ftp2.py", line 93, in download_file 
     ftps.retrlines("RETR " + remote_file, callback) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py", line 735, in retrlines 
     conn = self.transfercmd(cmd) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py", line 376, in transfercmd 
     return self.ntransfercmd(cmd, rest)[0] 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py", line 710, in ntransfercmd 
     conn, size = FTP.ntransfercmd(self, cmd, rest) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py", line 339, in ntransfercmd 
     resp = self.sendcmd(cmd) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py", line 249, in sendcmd 
     return self.getresp() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py", line 224, in getresp 
     raise error_perm, resp 
ftplib.error_perm: 550 file.txt: No such file or directory 

すべてのヘルプは非常にあります感謝。おかげさまで :)

答えて

1

remote_pathftps.retrlines("RETR " + remote_file, callback) remote_file を交換 してみてください。

関連する問題