Seite 1 von 1

http_get + csv

Verfasst: Sonntag 29. Mai 2016, 20:46
von Exedra
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 :)

Re: http_get + csv

Verfasst: Sonntag 29. Mai 2016, 21:10
von BlackJack
@Exedra: Eine Zeichenkette ist nicht das gleiche wie ein Dateiobjekt. `csv.reader()` erwartet letzteres, Du übergibst aber ersteres.

Re: http_get + csv

Verfasst: Sonntag 29. Mai 2016, 21:12
von snafu
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.

Re: http_get + csv

Verfasst: Sonntag 29. Mai 2016, 21:28
von snafu
Achja, eine mögliche Lösung wäre:

Code: Alles auswählen

csv.reader(dein_csv.splitlines())
Damit sollte der Code im Reader klarkommen.

Re: http_get + csv

Verfasst: Sonntag 29. Mai 2016, 21:49
von Exedra
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?!

Re: http_get + csv

Verfasst: Montag 30. Mai 2016, 00:41
von snafu
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.