rätselhafter ftp-upload

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
DB7WN
User
Beiträge: 49
Registriert: Samstag 18. März 2017, 22:11

Hallo allerseits!
Ich versuche eine einfache Textdatei mit ein paar Zeilen Python-Code in einen Webspace hochzuladen. Die Textdatei "1.txt" besteht zunächst mal aus zwei Zeilen, erstellt mit dem Windows10 Editor.
Dieser Code, den ich für diese Aufgabe im Netz vielfach gefunden habe, liefert mir eine Fehlermeldung.

Code: Alles auswählen

import ftplib
ftp = ftplib.FTP(host,username, passwort)
ftp.cwd("/")
file = open("1.txt","r")
ftp.storlines("STOR 1.txt", file) 
ftp.quit()
file.close()
Fehlermeldung u.a. :

File "z:\HTML\ftp\upload-ftp.py", line 9, in <module>
ftp.storlines("STOR 1.txt", file)
File "C:\Python36-32\lib\ftplib.py", line 538, in storlines
if buf[-1] in B_CRLF: buf = buf[:-1]
TypeError: a bytes-like object is required, not 'str'

Das sieht für mich so aus, als dass eine Binärdatei erwartet wird. Wieso das?
Im Zielverzeichnis ist dann eine Datei "1.txt" vorhanden, aber ohne Inhalt.

Wenn ich den Code ändere in "ftp.storbinary..." funktioniert alles.
Hat jemand dafür eine Erklärung - nur zum Wissen. Wie gesagt, 'irgendwie' funktionierts ja.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

probier mal
file = open("1.txt","rb")
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
DB7WN
User
Beiträge: 49
Registriert: Samstag 18. März 2017, 22:11

Oh,das geht.
file = open("1.txt","rb")
ftp.storlines("STOR 1.txt", file)

Wie passt daszusammen? Das wirft das den Haufen, was ich geglaubt hatte zu wissen.
Warum steht das überall anders?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

DB7WN hat geschrieben: Samstag 15. Dezember 2018, 00:08 Warum steht das überall anders?
Wo steht das denn anders? Die Doku von storlines() sagt jedenfalls, dass eine Datei im Binärmodus erwartet wird.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@snafu: Unter Python 2 ist das nicht zwingend notwendig und auch nicht dokumentiert. Weil `readline()` dort auch bei Dateien, welche im Textmodus geöffnet werden, ”Bytestrings” statt Unicode-Strings liefert.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
DB7WN
User
Beiträge: 49
Registriert: Samstag 18. März 2017, 22:11

Gut, dass es "überall" anders steht, ist wohl nicht ganz korrekt, aber:
hier (https://pythonspot.com/ftp-client-in-python/ - im Abschnitt "Uploadung files") werden Dateien des Typs ".txt", ".htm",".html"
mit "ftp.storlines" hochgeladen und die Datei ohne "rb" geöffnet.

Hier (https://gist.github.com/slok/1447559) wird die Datei nur mit 'r' geöffnet und je nach Dateityp mit
"ftp.storlines" oder auch "ftp.storbinary" hochgeladen.

Hier (https://www.atlantic.net/hipaa-complian ... ds-python/) wird die Datei vom Typ ".txt" mit 'r' geöffnet und mit
"ftp.storlines" hochgeladen.

Hier steht der Code, den ich für mich der Einfachheit halber versuchsweise mal rauskopiert habe, und der nicht funktioniert.
(Datei öffnen mit 'r', uploaden mit "ftp.storlines".

Letztendlich ist es für mich ausreichend, die Methode so benutzen zu können, dass sie funktioniert, ohne alles ganz genau zu verstehen.
Danke für die Hinweise.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DB7WN: Der erste und der dritte Link sind Python 2, und der zweite sehr wahrscheinlich auch, denn sonst würde das ja so nicht funktionieren.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
DB7WN
User
Beiträge: 49
Registriert: Samstag 18. März 2017, 22:11

__blackjack__ hat geschrieben: Sonntag 16. Dezember 2018, 22:52 @DB7WN: Der erste und der dritte Link sind Python 2, und der zweite sehr wahrscheinlich auch, denn sonst würde das ja so nicht funktionieren.
o.k. darüber bin ich schon öfter gestolpert. Ich muss wohl besser prüfen, welche Version beschrieben wird. Beim vierten habe ich vergessen den link einzutragen, aber das wird dann wohl genau so sein.
Antworten