http_get + csv

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
Benutzeravatar
Exedra
User
Beiträge: 2
Registriert: Sonntag 29. Mai 2016, 20:27

Hallo Forum :)

Ich bin zwar ein ziemlicher Neuling was Python und Programmieren angeht, aber ich hoffe, meine Frage ist dennoch nicht allzu blöde.

Mein Vorhaben ist eigentlich recht simpel: Ich will bei Yahoo Aktienkurse abfragen und diese dann in einer DB abspeichern.
Dafür muss man eigentlich nur die passende URL zusammenfrickeln und bekommt die Antwort als CSV geliefert.
Mit CSV hab ich auch schon ein wenig rumgespielt. Beziehungsweise bei csv-dateien gehts eigentlich nach Schema F, aus der python-doku, ohne Probleme.
Will ich nun aber die von Yahoo gelieferte Antwort parsen passieren seltsame Dinge.

Um das zu Verdeutlichen hier mal der code und was dabei rumkommt:

Code: Alles auswählen

import csv as csv
import urllib.request

def get_by_symbol(symbol):
    url = 'http://finance.yahoo.com/d/quotes.csv?s='
    url += symbol
    datapoints = '&f='
    datapoints += 'abgh'
    url += datapoints
    result = urllib.request.urlopen(url).read().decode('utf-8')
    print(result)
    results = csv.reader(result, delimiter=",")
    for row in results:
        print(row)
    return results

data = get_by_symbol('GOOGL')
Dabei liefern die Prints folgendes:

Code: Alles auswählen

748.00,737.64,737.01,747.91

['7']
['4']
['8']
['.']
['0']
['0']
['', '']
['7']
['3']
['7']
['.']
['6']
['4']
['', '']
['7']
['3']
['7']
['.']
['0']
['1']
['', '']
['7']
['4']
['7']
['.']
['9']
['1']
[]
Das erste ist so ziemlich genau das, was ich erwarten würde. Aber was mach ich hier Falsch, dass anstatt bei den Kommas nach jedem Zeichen gesplittet wird?

Ich raff des nit... Die Sachen, die ich bisher bei google gefunden habe (z.b. http://stackoverflow.com/questions/1628 ... url-python) haben mir leider noch nicht so die Erleuchtung gebracht -.-


Schönen Sonntag Abend wünsch ich noch :)
Zuletzt geändert von Anonymous am Montag 30. Mai 2016, 08:51, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
wubba lubba dub dub
BlackJack

@Exedra: Eine Zeichenkette ist nicht das gleiche wie ein Dateiobjekt. `csv.reader()` erwartet letzteres, Du übergibst aber ersteres.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das CSV-Modul ist für Dateien gedacht, aber du übergibst eine einzelne Zeile. Ohne jetzt tiefer in den Modul-Code geschaut zu haben, vermute ich doch stark, dass irgendwo im CSV-Modul etwas wie ``for line in csvfile`` vorkommt. Der Code nimmt also an, dass er über die Zeilen iterieren kann. Ein Iterieren über deinen String führt jedoch dazu, dass die einzelnen Zeichen ausgespuckt werden. Daher das komische Ergebnis.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Achja, eine mögliche Lösung wäre:

Code: Alles auswählen

csv.reader(dein_csv.splitlines())
Damit sollte der Code im Reader klarkommen.
Benutzeravatar
Exedra
User
Beiträge: 2
Registriert: Sonntag 29. Mai 2016, 20:27

Sauber, das funktioniert

Dankeschön :D


seh ich das richtig, dass
blah.splitlines()
das gleiche macht wie
[blah]
?
(Zumindest im Falle dieses einzeilers)

Letzteres wären ja ein paar Zeichen die man sich sparen könnte?!
wubba lubba dub dub
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ja, das siehst du richtig. Wenn es sich immer nur um eine Zeile handelt, dann kannst du auch direkt eine Liste verwenden.

Übrigens, falls die Daten immer so strukturiert sind wie bei deinem eingangs gezeigten Beispiel, dann reicht auch ein ``csv_data.split(',')`` aus. Dann musst du die einzelnen Zeilen nicht so umständlich an den Reader übergeben. Oder du sammelst die Zeilen vorab in einer Liste und übergibst diese an den Reader.
Antworten