Dateien herunterladen und in einem Verzeichnis ablegen

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
aaron
User
Beiträge: 92
Registriert: Donnerstag 1. Dezember 2016, 23:10

Ich möchte Dateien von einem Server herunterladen.

https://example.com/Alpha/2015/1.csv.gz

Die Struktur ist also folgende:
https://example.com/symbol/year/1.cvs.gz

mein Ansatz sieht so aus

Code: Alles auswählen

data_path = symbol+'/'+year
print(data_path)
if not os.path.exists('./data/data_path'):
    os.makedirs('./data/data_path')
print(data_path) zeigt das richtige Ergebnis:
Alpha/2015
Beta/1999
Gamma2000

Im nächsten Schritt möchte ich prüfen, ob das Verzeichnis schon existiert und eine Datei namens 1.csv.gz befindet. Wenn nicht, dann soll das Verzeichnis angelegt werden und die Datei 1.csv.gz herunter geladen werden. Das Ergebnis ist data/data_path und nicht wie gewünscht data/Alpha/2015 usw..
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@aaron: Du wünschst Dir aber './data/data_path' und das bekommst Du auch. Namen in Zeichenketten werden nicht auf magische Weise durch die Werte von Variablen mit dem selben Namen ersetzt. Warum sollte auch data_path ersetzt werden, data aber nicht?
Wie es richtig geht, hast Du doch schon in der ersten Zeile gezeigt.
Noch richtiger ist es, mit os.path.join zu arbeiten:

Code: Alles auswählen

datapath = os.path.join(symbol, year)
aaron
User
Beiträge: 92
Registriert: Donnerstag 1. Dezember 2016, 23:10

Danke für die schnelle Hilfe. Leider funktioniert es nicht. Hier noch einmal das Beispiel.

Code: Alles auswählen

datapath = os.path.join(symbol, year)
        print(datapath)
        if not os.path.exists('./data/datapath'):
            os.makedirs('./data/datapath')
Die Verzeichnisse
data/
Alpha/2015
Beta/1999
Gamma/2000
werde nicht angelegt, obwohl print(datapath) richtig ausgegeben wird..Es wird wie gehabt data/datapath als Verzeichnisse angelegt.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@aaron: wenn Du nichts am Code änderst, wie soll sich dann was am Ergebnis ändern?
aaron
User
Beiträge: 92
Registriert: Donnerstag 1. Dezember 2016, 23:10

Ich verstehe was Du meinst, leider habe in keine Idee das Problem richtig zu lösen. auch Google war in diesem Fall nicht hilfreich.
Ich würde mich über einen Lösungsansatz freuen.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

aaron hat geschrieben:Ich würde mich über einen Lösungsansatz freuen.
Du hast './data/datapath' und erwartest jetzt offensichtlich, dass `datapath` auf magische Art und Weise durch den Inhalt der vorher deklarierten Variable `datapath` ersetzt wird. Das funktioniert so nicht.

Warum setzt du die Bestandteile './data' und datapath nicht auch einfach mit `os.path.join` zusammen?
aaron
User
Beiträge: 92
Registriert: Donnerstag 1. Dezember 2016, 23:10

Würde ich gern machen. leider ohne Erfolg. Wie ist es richtig?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Code: Alles auswählen

>>> import os
>>> eine_sache = "a"
>>> noch_ne_sache = "b"
>>> eine_weitere_variable = "c"
>>>
>>> neue_variable = os.path.join(eine_sache, noch_ne_sache)
>>> noch_neuere_variable = os.path.join(neue_variable, "was_anderes_das_ein_string_und_NICHT_variabel_ist", eine_weitere_variable)
>>> noch_neuere_variable
'a/b/was_anderes_das_ein_string_und_NICHT_variabel_ist/c'
aaron
User
Beiträge: 92
Registriert: Donnerstag 1. Dezember 2016, 23:10

Danke für die Hilfe. Ich habe verstanden. Es funktioniert.
aaron
User
Beiträge: 92
Registriert: Donnerstag 1. Dezember 2016, 23:10

Nachdem nun der erste Teil funktioniert möchte ich gern, daß die erzeugten Dateien heruntergeladen werden und in dem richtigen Verzeichnis gespeichert werden. Die Dateien heißen
[codebox=text file=Unbenannt.txt]data/
Alpha/2015/1.csv.gzip
/2.csv.gzip
/3.csv.gzip
Beta/1999/1.csv.gzip
Gamma/2000/1.csv.gzip[/code]

Die Dateien werden nicht in die entsprechenden Verzeichnisse kopiert. Es wird eine Datei data_path erzeugt.

Code: Alles auswählen

data_path = os.path.join("data", symbol, year)
        print(data_path)
        if not os.path.exists(data_path):
            os.makedirs(data_path)
            response = urllib2.urlopen(url_data)
            gzipcontent = response.read()
            with open('data_path', 'w') as f: 
                f.write(gzipcontent)
Zuletzt geändert von Anonymous am Mittwoch 15. März 2017, 14:29, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@aaron: ähm? Diese Frage ist jetzt nicht Dein Ernst??? Lies noch mal die letzten Beiträge.
aaron
User
Beiträge: 92
Registriert: Donnerstag 1. Dezember 2016, 23:10

Ich brauche dringend Hilfe. Ich verstehe nicht wie ich das Problem löen soll.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

aaron hat geschrieben:Danke für die Hilfe. Ich habe verstanden. Es funktioniert.
Wenn dieser Beitrag ehrlich gemeint war, dann verstehe ich nicht, wo jetzt noch ein Problem besteht.
aaron
User
Beiträge: 92
Registriert: Donnerstag 1. Dezember 2016, 23:10

Ich stelle fest, das ich noch immer nicht verstanden habe dieses Problem zu lösen. der erste Teile funktioniert tadellos. Jetzt will ich die Dateien von einem Server https://example.com/symbol/year/1.csv.gz herunterladen und in das entsprechende Verzeichnis schieben, aber nur dann, wenn die Datei nicht vorhanden ist.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

aaron hat geschrieben:Ich brauche dringend Hilfe.
Offensichtlich hast du Probleme die Namen von Bezeichnern und die Inhalte von Strings auseinanderzuhalten.

Code: Alles auswählen

message = 'hello'
print(message)
print('message')
Verstehst du warum die durch diesen Code erzeugte Ausgabe so ist wie sie ist? Wenn du die Ausgabe verstehst, dann wende dieses Wissen auf dein Problem mit dem `open('data_path', 'w')` an. Wenn nicht, dann müssten wir von ganz vorne anfangen und dafür gibt es bereits ein Tutorial.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Lewis Carroll - bürgerlich Charles Lutwidge Dodgson, von Beruf Mathematiker - beschreibt den Unterschied um den es hier geht so:
Lewis Carroll hat geschrieben:“You are sad,” the Knight said in an anxious tone: “Let me sing you a song to comfort you.”
“Is it very long?” Alice asked, for she had heard a good deal of poetry that day.
“It's long,” said the Knight, “but it's very, very beautiful. Everybody that hears me sing it - either it brings the tears to their eyes, or else -”
“Or else what?” said Alice, for the Knight had made a sudden pause.
“Or else it doesn't, you know. The name of the song is called ‘Haddocks' Eyes.’”
“Oh, that's the name of the song, is it?" Alice said, trying to feel interested.
“No, you don't understand,” the Knight said, looking a little vexed. “That's what the name is called. The name really is ‘The Aged Aged Man.’”
“Then I ought to have said ‘That's what the song is called’?” Alice corrected herself.
“No, you oughtn't: that's quite another thing! The song is called ‘Ways And Means’: but that's only what it's called, you know!”
“Well, what is the song, then?” said Alice, who was by this time completely bewildered.
“I was coming to that,” the Knight said. “The song really is ‘A-sitting On A Gate’: and the tune's my own invention.”
In specifications, Murphy's Law supersedes Ohm's.
aaron
User
Beiträge: 92
Registriert: Donnerstag 1. Dezember 2016, 23:10

Hier noch einmal eine Zusammenfassung:

Code: Alles auswählen

for symbol in symbol:
    for i in range(start_wk, end_wk):
        url_data = os.path.join(url, symbol, year, str(i)+url_suffix)
        print(url_data)
        request = urllib2.Request(url_data)
        response = urllib2.urlopen(request)
        buf = StringIO(response.read())
        f = gzip.GzipFile(fileobj=buf)
        data = f.read()
        print(len(data))
# Import the file 1.csv.gz from https://example.com/symbol/year/1.csv.gz into the directory data/symbol/year/1.csv.gz
        data_path = os.path.join("data", symbol, year)
        print(data_path)
        if not os.path.exists(data_path):
            os.makedirs(data_path)
            gzipfile = response.read()
            with open(url_data, 'wb') as f:
                f.write(gzipfile)
Die Verzeichnisse werden richtig andgelegt:
data/symbol/year

Folgende Ausgaben werden dabei erzeugt:
https://example.com/symbol/year/1.csv.gz
108336468
data/Alpha/2015
https://example.com/Beta/1999/1.csv.gz
105123380
data/Beta/1999

Aber die Datei wird nicht heruntergeladen und an die richtige Stelle geschoben.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@aaron: Lies doch mal, was Du da geschrieben hast. So eine lange Funktion solltest Du auch dringend in kleinere Teile aufteilen, die Du dann auch separat testen kannst. Es wird wohl nichts passieren, weil Du in einem früheren Lauf schon alle Verzeichnisse erstellt hast. Sollte es doch noch eins geben, das noch nicht existiert hat, dann findet er das Verzeichnis "https:" nicht. Sollte das doch aus irgend einem Grund existieren, wäre wohl die erzeugte Datei leer, weil Du die Daten sie schon vorher komplett gelesen hast.
aaron
User
Beiträge: 92
Registriert: Donnerstag 1. Dezember 2016, 23:10

Ich bekomme es nicht in den Griff. Würde sich bitte jemand herablassen und diese zwei Funktionen für mich schreiben. Ich will auch noch abprüfen ob der Download erfolgreich war oder nicht. Dafür bedarf es wahrscheinlich noch einer weiteren Funktion.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@aaron: wenn das ganze Problem für Dich zu schwierig ist, dann spalte es in Teilprobleme auf, solange, bis Du das Teilproblem lösen kannst. Was sind die drei Dinge, die Du tun willst?
Antworten