2010-05-26 15 views
10

Mój skrypt python2 ładuje pliki ładnie za pomocą tej metody, ale python3 przedstawia problemy i utknąłem, gdzie pójść dalej (googling nie pomógł).Jak wgrać plik binarny z ftplib w Pythonie?

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

Błąd pojawia się

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 

Próbowałem zmiany kodu do

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

Ale zamiast tego mam to

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 

Czy ktoś może wskazać mi w właściwy kierunek

+0

nic py3k wyłączności o tym mowa. – SilentGhost

+1

To nie jest py3k ekskluzywny, ale dzieje się tak, jak ten sam kod nagle rzucił błąd (i na podstawie twojej odpowiedzi było to słuszne) związane z kodowaniem ciągów, które uważałem za możliwe. – Teifion

Odpowiedz

29

Problem nie dotyczy argumentu polecenia, ale obiektu pliku. Skoro jesteś przechowywania pliku binarnego trzeba otworzyć plik z 'rb' flagi:

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

W pracy w tej chwili przetestuję go, gdy wrócę do domu i mam nadzieję, że wszystko będzie wspaniałe, dzięki! – Teifion

1

DOŁĄCZ złożyć w FTP.

Uwaga:to nie SFTP - FTP tylko

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

Powiązane problemy