HTML von FTP downloaden, bearbeiten und uploaden

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
axle
User
Beiträge: 5
Registriert: Sonntag 13. Dezember 2009, 20:43

Hi,

ich habe vor eine Homepage per Skript bearbeiten zu lassen (sozusagen wie ein Blog). Dazu muss ich auf einen FTP-Server connecten, die Datei runterladen, sie bearbeiten und dann wieder hochladen. Hier mein Code bisher:

Code: Alles auswählen

from ftplib import FTP
from os import remove

ftp = FTP("server-domain")		
ftp.login("user", "pass")


datei=open("index.html", "w+")
ftp.retrlines("RETR index.html", datei.writelines)


print datei #nur zum Test

ftp.delete("index.html")
ftp.storlines("STOR index.html", datei)
ftp.quit()
datei.close()
remove("index.html")
Die Datei wird auch runter und wieder hoch geladen, nur wird wohl ein Teil vorne und ein Teil hinten gelöscht, die Datei fängt dann mitten im Header an :-S. Dadurch sieht man einen Teil des Headers auf der Website... Vielleicht kann mir jemand helfen, wäre toll!

axle
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Benutzt Du Windows? Vllt. hilft Dir der binary-Modus weiter, obwohl der Text-Modus nicht ganze Teile von Dateien "verschlucken" sollte, zumal es ja auch noch Textdateien sind.
Zum Ausprobieren:

Code: Alles auswählen

...
#ftp.retrlines("RETR index.html", datei.writelines)
ftp.retrbinary('RETR index.html', datei.write)
...
#ftp.storlines("STOR index.html", datei)
ftp.storbinary("STOR index.html", datei)
axle
User
Beiträge: 5
Registriert: Sonntag 13. Dezember 2009, 20:43

Das hab ich zwar glaub' ich schon probiert, aber nochmal kann nie schaden... ;)

Muss ich nicht dann auch die Datei mit "w+b" öffnen? Um binär schreiben zu können?
axle
User
Beiträge: 5
Registriert: Sonntag 13. Dezember 2009, 20:43

OK, hab das mal laufen lassen...
Wenn ich nur die ftp.* Anweisungen ersetze, besteht die Datei die hochgeladen wurde so ziemlich nur noch aus "NUL NUL NUL NUL ..."

Wenn ich die Datei mit "w+b" öffne, auch :D.

Das kann doch irgendwie nicht sein. Achja, ja, ich benutz Windows dazu.

Neuer Code:

Code: Alles auswählen

from ftplib import FTP
from os import remove

ftp = FTP("host")		
ftp.login("user", "pass")


datei=open("index.html", "w+b")
#~ ftp.retrlines("RETR index.html", datei.writelines)
ftp.retrbinary('RETR index.html', datei.write)


ftp.delete("index.html")
#~ ftp.storlines("STOR index.html", datei)
ftp.storbinary('STOR index.html', datei)
ftp.quit()
datei.close()
remove("index.html")
Zuletzt geändert von axle am Montag 14. Dezember 2009, 13:56, insgesamt 1-mal geändert.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

axle hat geschrieben:...
Muss ich nicht dann auch die Datei mit "w+b" öffnen? Um binär schreiben zu können?
Ja genau.

Ich kann mir auch nicht vorstellen, dass es daran liegen soll, ist die Datei denn im Editor, also nach dem Runterladen via FTP noch intakt?

edit:
Hm, wie hast Du die Datei zum Lesen geöffnet?
axle
User
Beiträge: 5
Registriert: Sonntag 13. Dezember 2009, 20:43

Mit:

Code: Alles auswählen

datei=open("index.html", "w+b")
Siehe Code im Post davor...
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Hui, hier passiert was ganz anderes ;) Schliesse die Datei doch mal und öffne sie explizit zum Lesen neu.
(Hinweis: Dateien haben einen Cursor, d.h. read() und write() arbeiten ab der aktuellen Cursorposition ;) )

Cursorposition kannst Du mit file.tell() auslesen und mit file.seek() setzen.

Ich hab Deinen Code nicht wörtlich genug genommen, aber die Curorsache dürfte die Ursache Deines Problems sein.
axle
User
Beiträge: 5
Registriert: Sonntag 13. Dezember 2009, 20:43

Du hattest recht... Jetzt gehts wunderbar :)
Dankeschön!

Ich werd jetzt mal anfangen, den Code zum Bearbeiten einzubauen, wahrscheinlich brauch ich da nochmal Hilfe ;).
Benutzeravatar
Mathmos
User
Beiträge: 36
Registriert: Dienstag 10. August 2010, 21:31

Hallo

ich versuche auch gerade eine datei herunterzuladen und zu bearbeiten udn wieder hochzuladen.
allerdings habe ich ein problem mit dem bearbeiten und dann wieder hoch laden.

Fehlermeldung:

Code: Alles auswählen

'str' object has no attribute 'read'

Code: Alles auswählen

from ftplib import FTP
from os import remove

ftp = FTP("------")              
ftp.login("------", "--------")

datei=open("index.html", "w+b")
ftp.retrbinary('RETR index.html', datei.write)
datei.close()

datei=open("index.html", "r+b")
bearbeitet = datei.read().replace("Wir sind umgezogen", "Wir ziehen doch nicht um")

ftp.delete("index.html")
ftp.storbinary('STOR index.html', bearbeitet)
ftp.quit()
datei.close()
remove("index.html")
BlackJack

@Mathmos: Bei Tracebacks bitte immer den *gesamten* Traceback zeigen, damit man nicht raten muss *wo* die Ausnahme aufgetreten ist.

Du übergibst `bearbeitet` an `ftp.storbinary()`. Schau mal was `bearbeitet` für ein Datentyp ist und was die Funktion an der Stelle erwartet.
Antworten