ftplip Variablen uploaden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Hallo, kann man mit "ftplib" auch Variablen uploaden?
Also ich habe eine Variable die eine Liste beinhaltet.
Bisher hat es nur mit Dateien funktioniert, leider finde ich nichts dazu.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. FTP heisst ja "file transfer protocol". Das kann nur Dateien. Was man natuerlich tun koennte waere die Daten die man irgendwohin speichern will in eine Datei zu speichern, und DIE kann man dann per FTP irgendwohin laden. Und man kann ein io.StringIO-Objekt benutzen statt einer echten Datei. Das ist sauberer. Und mit zB dem json-Modul kann man die Liste in eine Datei ueberfuehren, und aus ihr wieder die Liste gewinnen.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Alles klar vielen Dank.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ich habe mir das mal mit dem io. modul angeschaut im howto, aber ich bekomme immer Fehler, wenn ich eine Liste im Parameter übergebe.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@egon11: Du musst als erstes ein entsprechendes dateiähnliches Objekt aus `io` erstellen, wobei ich da nicht `StringIO` verwenden würde, sondern `BytesIO`, und dann die Liste irgendwie dort rein serialisieren wie in eine normale Datei. Da kannst Du ja auch nicht einfach eine Liste rein schreiben. Vorgeschlagen wurde von __deets__ JSON als Format. Da hat Python das `json`-Modul in der Standardbibliothek.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Mit "json" muss ich quasi eine liste in read() convertieren?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich verstehe Deine letzte Frage nicht. Was hat das mit `read` zu tun, wenn Du etwas schreiben willst?
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Wenn ich mit `ftlip` eine Datei auslese, muss sie ja "read()" fähig sein zeigt mir die Ausgabe an.

Jetzt habe ich mal das Beispiel io.StringIO() getestet, Ergebnis ist, es printet nichts.

Code: Alles auswählen

import io

output = io.StringIO()
output.write('First line.\n')
print('Second line.', output)

contents = output.getvalue()


output.close()
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@egon11: Also bei mir wird wie erwartet folgendes ausgegeben:

Code: Alles auswählen

Second line. <_io.StringIO object at 0x7f2a19656e58>
Wenig sinnvoll, aber es wird etwas ausgegeben. Und der Code macht auch gar nichts mit `contents` – warum?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Mh, bis jetzt bin ich ehrlich gesagt kein Stück weiter, ich dachte man kann eine Variable wie eine Datei behandeln.
Mit json habe ich es bis jetzt überhaupt nicht hinbekommen.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann zeig doch mal was du tust. Statt immer nur drüber zu reden.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Bis jetzt habe ich das versucht:

Code: Alles auswählen

import json
from io import StringIO
io = StringIO()
a = ["1"]
b = json.dump(a, io)

print(io.read())
gibt mir nichts aus.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Nach dem Schreiben ist auch der Filepointer am Ende der Datei.

Code: Alles auswählen

import json
from io import StringIO
data = StringIO()
a = ["1"]
b = json.dump(a, data)
data.seek(0)
print(data.read())
Wie aber schon __blackjack__ geschrieben hat, ist es besser, `BytesIO` zu verwenden:

Code: Alles auswählen

contents = json.dumps(a)
data = io.BytesIO(contents.encode('utf8'))
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Jetzt habe ich das so gemacht, aber es liest mir die liste "[]" mit ein. Bekomme ich das dann noch weg?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Weißt du was json ist?
Zeit uns mit (mit deinem eingesetzten Code) was du tust, was das Ergebnis ist und was du für ein Ergebnis erwartest.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe das schon oft gesagt, und ich sage es wieder: wenn du solche Fragen stellst, dann zeig. uns. den. Code. Niemand hier kann erraten, was du da gebastelt hast.

So geht es, ohne ftp in the mix, weil ich keinen FTP-Server habe:

Code: Alles auswählen

import io
import json

TEMP_FILE_NAME = "/tmp/foobar.dat"

def main():
    data = [1, 2, 3]
    output_file = io.BytesIO(json.dumps(data).encode("utf-8"))

    # simulate writing /reading file via ftp
    with open(TEMP_FILE_NAME, "wb") as outf:
        outf.write(output_file.read())

    with open(TEMP_FILE_NAME, "rb") as inf:
        data_from_file = json.load(inf)

    assert data == data_from_file

if __name__ == '__main__':
    main()
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Ok, genau das habe ich gesucht, vielen Dank.
Antworten