Seite 1 von 9

Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 09:12
von aaron
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..

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 09:27
von Sirius3
@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)

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 09:45
von aaron
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.

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 10:14
von Sirius3
@aaron: wenn Du nichts am Code änderst, wie soll sich dann was am Ergebnis ändern?

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 11:13
von aaron
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.

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 11:46
von /me
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?

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 11:57
von aaron
Würde ich gern machen. leider ohne Erfolg. Wie ist es richtig?

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 12:00
von __deets__

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'

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 12:14
von aaron
Danke für die Hilfe. Ich habe verstanden. Es funktioniert.

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 13:43
von aaron
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)

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 13:49
von Sirius3
@aaron: ähm? Diese Frage ist jetzt nicht Dein Ernst??? Lies noch mal die letzten Beiträge.

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 15:15
von aaron
Ich brauche dringend Hilfe. Ich verstehe nicht wie ich das Problem löen soll.

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 15:19
von Sirius3
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.

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 15:21
von aaron
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.

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 15:25
von /me
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.

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 16:12
von pillmuncher
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.”

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 17:19
von aaron
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.

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 18:22
von Sirius3
@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.

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 20:56
von aaron
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.

Re: Dateien herunterladen und in einem Verzeichnis ablegen

Verfasst: Mittwoch 15. März 2017, 21:56
von Sirius3
@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?