2010-05-26 9 views
10

Mon script python2 télécharge joliment les fichiers en utilisant cette méthode, mais python3 présente des problèmes et je suis coincé sur la prochaine étape (googling n'a pas aidé).Comment télécharger le fichier binaire avec ftplib en Python?

from ftplib import FTP 
ftp = FTP(ftp_host, ftp_user, ftp_pass) 
ftp.storbinary('STOR myfile.txt', open('myfile.txt')) 

L'erreur que je reçois est

Traceback (most recent call last): 
    File "/Library/WebServer/CGI-Executables/rob3/functions/cli_f.py", line 12, in upload 
    ftp.storlines('STOR myfile.txt', open('myfile.txt')) 
    File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 454, in storbinary 
    conn.sendall(buf) 
TypeError: must be bytes or buffer, not str 

J'ai essayé de modifier le code pour

from ftplib import FTP 
ftp = FTP(ftp_host, ftp_user, ftp_pass) 
ftp.storbinary('STOR myfile.txt'.encode('utf-8'), open('myfile.txt')) 

Mais au lieu que je suis arrivé ce

Traceback (most recent call last): 
    File "/Library/WebServer/CGI-Executables/rob3/functions/cli_f.py", line 12, in upload 
    ftp.storbinary('STOR myfile.txt'.encode('utf-8'), open('myfile.txt')) 
    File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 450, in storbinary 
    conn = self.transfercmd(cmd) 
    File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 358, in transfercmd 
    return self.ntransfercmd(cmd, rest)[0] 
    File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 329, in ntransfercmd 
    resp = self.sendcmd(cmd) 
    File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 244, in sendcmd 
    self.putcmd(cmd) 
    File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 179, in putcmd 
    self.putline(line) 
    File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/ftplib.py", line 172, in putline 
    line = line + CRLF 
TypeError: can't concat bytes to str 

Quelqu'un peut-il me diriger dans la droite direction

+0

il n'y a rien Py3K exclusif à cette question. – SilentGhost

+1

Ce n'est pas exclusif py3k mais en passant par la façon dont le même code a soudainement jeté une erreur (et en fonction de votre réponse, il était juste de le faire) liée à l'encodage de chaîne je suppose qu'il pourrait être. – Teifion

Répondre

29

Le problème ne concerne pas l'argument de commande, mais l'objet fichier. Puisque vous stockez binaire vous avez besoin d'ouvrir le fichier avec 'rb' drapeau:

>>> ftp.storbinary('STOR myfile.txt', open('myfile.txt', 'rb')) 
'226 File receive OK.' 
+0

Au travail en ce moment, va tester quand je rentre à la maison et j'espère que tout sera grand, merci! – Teifion

1

APPEND pour déposer en FTP.

Note:ce n'est pas SFTP - FTP uniquement

import ftplib 
ftp = ftplib.FTP('localhost') 
ftp.login ('user','password') 
fin = open ('foo.txt', 'r') 
ftp.storbinary ('APPE foo2.txt', fin, 1) 

Ref: Thanks to Noah