2013-07-03 14 views
12

Ich versuche, Datei von Windows Server auf einen Unix-Server hochladen (grundsätzlich versuchen, FTP zu tun).FTP-Upload-Dateien Python

Traceback (most recent call last): 
    File "Windows\folder\which\has\file\MyFile.py", line 11, in <module> 
    ftp.storbinary('RETR %s' % filename, open(filename, 'w').write) 
    File "windows\folder\Python\lib\ftplib.py", line 466, in storbinary 
    buf = fp.read(blocksize) 
AttributeError: 'builtin_function_or_method' object has no attribute 'read' 

Auch alle Inhalte MyFile.py gelöscht habe: Ich habe den Code unten

#!/usr/bin/python 
import ftplib 
import os 
filename = "MyFile.py" 
ftp = ftplib.FTP("xx.xx.xx.xx") 
ftp.login("UID", "PSW") 
ftp.cwd("/Unix/Folder/where/I/want/to/put/file") 
os.chdir(r"\\windows\folder\which\has\file") 
ftp.storbinary('RETR %s' % filename, open(filename, 'w').write) 

Ich erhalte den folgenden Fehler verwendet.

Kann jemand beraten, was falsch läuft.Ich habe gelesen, dass ftp.storbinary zum Hochladen von Dateien mit FTP verwendet wird.

Antwort

12

Wenn Sie versuchen, eine nicht binäre Datei (wie eine Textdatei) zu speichern, versuchen Sie, es in den Lesemodus anstatt in den Schreibmodus zu setzen.

ftp.storlines("STOR " + filename, open(filename, 'r')) 

für ein Binärdatei (alles, was nicht in einem Texteditor geöffnet werden kann) öffnen Sie im Lese Binärmodus

ftp.storbinary("STOR " + filename, open(filename, 'rb')) 

auch wenn Sie sich mit dem ftp lib planen sollten Sie wahrscheinlich gehe durch ein Tutorial, ich würde dieses article von effbot empfehlen.

+0

Der Inhalt von MyFile.py wird nicht gelöscht. Aber ich bin immer noch ärgerlich über den Fehler. – misguided

+2

Die Verwendung von Storlines setzt voraus, dass Myfile eine Textdatei ist. Für andere Dateien (Bilder, Filme, Archive, grundsätzlich alles was Sie nicht in einem Texteditor öffnen und lesen können) sollten Sie storbinary verwenden und die Datei mit 'rb' statt nur 'r –

+0

nach http: //bugs.python öffnen .org/issue6822 Nicht-binäre Dateien sollten auch mit 'rb' Flag geöffnet werden, aber danach noch mit 'storlines()' hochgeladen werden. gerade konfrontiert dieses Problem mit 'r' und 'Typ str unterstützt nicht die Puffer-AP' Ausnahme für die Verbindung zur Verfügung gestellt. –

3

versuchen Sie, die Datei zu einem Objekt zu machen, damit Sie es am Ende der Operation schließen können.

myfile = open(filename, 'w') 
ftp.storbinary('RETR %s' % filename, myfile.write) 

und am Ende des Transfers

myfile.close() 

könnte dies das Problem nicht lösen, aber es kann helfen.

+0

immer noch der gleiche Fehler. – misguided

+0

Ahh, schön zu hören, dass du es am Ende herausgefunden hast! – mbdavis

8

Kombiniert beide Vorschläge. Endgültige Antwort ist

#!/usr/bin/python 
import ftplib 
import os 
filename = "MyFile.py" 
ftp = ftplib.FTP("xx.xx.xx.xx") 
ftp.login("UID", "PSW") 
ftp.cwd("/Unix/Folder/where/I/want/to/put/file") 
os.chdir(r"\\windows\folder\which\has\file") 
myfile = open(filename, 'r') 
ftp.storlines('STOR ' + filename, myfile) 
myfile.close() 
+3

Die Verwendung von Storlines setzt voraus, dass Myfile eine Textdatei ist. Für andere Dateien (Bilder, Filme, Archive, grundsätzlich alles, was man nicht in einem Texteditor öffnen und lesen kann) sollte man storbinary verwenden und die Datei mit 'rb' anstatt nur 'r' öffnen –

+0

Zumindest in der aktuellen Version Sie müssen die Datei im Binärmodus ('rb') öffnen, um sie zu senden, sonst erhalten Sie einen Fehler. EDIT: habe nicht gemerkt, dass jemand das schon gesagt hat ^ –