2017-06-23 4 views
1

Ich versuche, eine CSV in ein Diktat zu konvertieren, aber ich kann nicht die richtige Ausgabe erhalten.Get Wörterbuch von CSV-Datei durch Konvertierung

Grundsätzlich habe ich eine CSV-Datei, die Ganzzahlen in der sechsten und siebten Spalte enthält, die im 'dict' in 'lat' und 'lon' konvertiert werden sollten.

Das ist, was ich versuche:

with open('secondhand_data.csv', 'rb') as f: 
    reader = csv.reader(f, delimiter=';') 
    output2['lon'] = {row[6] for row in reader} 
    output2['lat'] = {row[7] for row in reader} 

Mein Ergebnis ist:

{'lat': set([]), 'lon': set(['', '16.33052', '16.38002', '16.38414', '16.34794', '16.34797', '16.33351', '16.46922', '16.33353', '16.33367', '16.38552', '16.33354', '16.41716', ...])} 

Aber was muss ich genau:

{'lat': ['53.1445116550943', '53.134787053494', '53.1383785260816', '53.330366', '55.8611098159417', ...], 'lon' : ['', '16.33052', '16.38002', '16.38414', '16.34794', '16.34797', '16.33351', ...]} 

Weiß jemand, was ich m falsch machen? Vielen Dank im Voraus!

@jacoblauw: Die CSV-Datei sieht so aus ... es ist ein bisschen chaotisch, sorry dafür.

Waage, Deko/ Vintage/ Retro/ Nostalgie;http://www.willhaben.at/iad/kaufen-und-verkaufen/d/waage-deko-vintage-retro-nostalgie-208813335/;" 
Doris S.";10;1030 Wien, 03. Bezirk, Landstraße; ;16.38575;48.19149;Fasangasse, Ecke Rennweg1030 Wien, 03. Bezirk, LandstraßeWien 
schloss;http://www.willhaben.at/iad/kaufen-und-verkaufen/d/schloss-208789390/;" 
Angelina";10;1100 Wien, 10. Bezirk, Favoriten; ;16.35809;48.17209;Hardtmuthgasse1100 Wien, 10. Bezirk, FavoritenWien 
RC Boot;http://www.willhaben.at/iad/kaufen-und-verkaufen/d/rc-boot-208786703/;" 
privat";15;1100 Wien, 10. Bezirk, Favoriten; ;;; 
taschenmesser solingen dirlam & Sohn Söhne horn kleine beschädigung mit hülle;http://www.willhaben.at/iad/kaufen-und-verkaufen/d/taschenmesser-solingen-dirlam-sohn-soehne-horn-kleine-beschaedigung-mit-huelle-208768953/;" 
rabe";25;1200 Wien, 20. Bezirk, Brigittenau; ;16.37349;48.23059;brigittenau1200 Wien, 20. Bezirk, BrigittenauWien 
Konvolut Gama Norev Matchbox Lesney Corgi Wiking Schuco piccolo...14 teilig, alt, defekt;http://www.willhaben.at/iad/kaufen-und-verkaufen/d/konvolut-gama-norev-matchbox-lesney-corgi-wiking-schuco-piccolo-14-teilig-alt-defekt-208752031/;" 
Peter";50;1190 Wien, 19. Bezirk, Döbling; ;16.35537;48.27574;Heiligenstädterstr.1190 Wien, 19. Bezirk, DöblingWien 
DAS HAUS DER SCHWÄNE/ A. J. CRONIN, geb. Jubiläumsausgabe von 1934,;http://www.willhaben.at/iad/kaufen-und-verkaufen/d/das-haus-der-schwaene-a-j-cronin-geb-jubilaeumsausgabe-von-1934-208735636/;" 
Annemarie";5;1230 Wien, 23. Bezirk, Liesing; ;16.28017;48.15508;Karl Schwed Gasse1230 Wien, 23. Bezirk, LiesingWien 
Röhrenradio;http://www.willhaben.at/iad/kaufen-und-verkaufen/d/roehrenradio-208710345/;" 
+0

Können Sie die csv posten, oder eine kleine Menge, die verwendet werden kann, um Ihre Ergebnisse zu reproduzieren? – jacoblaw

+0

warum nicht 'dicreader' verwenden? –

+0

Ihr Leser wird vollständig von der 'output2 [' lon '] = {Zeile [6] für die Zeile im Leser}' Zeile verbraucht. Für Lat ist nichts mehr übrig. – stefan

Antwort

2

Ersetzen Sie Ihren Satz Verständnis mit einer Liste Verständnis. Außerdem sind Ihre Daten nicht konsistent. Um dies zu umgehen, sollten Sie Ihren Code in eine try-except-Klammer setzen und auch nach nicht leeren Werten suchen.

import csv 
with open('...', 'r') as f: 
    reader = csv.reader(f, delimiter=';') 
    output2 = { 'lat' : [], 'lon' : [] } 
    for row in reader: 
     try: 
      if row[7] != '' and row[6] != '': 
       output2['lat'].append(row[7]) 
       output2['lon'].append(row[6]) 
     except: 
      pass 
print(output2) 

Ausgang:

{'lat': ['48.17209', '48.23059', '48.27574', '48.15508'], 'lon': ['16.35809', '16.37349', '16.35537', '16.28017']} 
+0

Abgesehen von der Tatsache, dass Zeile [6] und Zeile [7] immer noch richtig sind, siehe .csv Datei bearbeiten, gibt mir das immer noch: '{'lat': set (['', '48 .1803 ', '48 .20549', ...], 'lon': set (['', '16 .33052 ', '16 .38002', ...])}} und nicht '{'lat': [...], 'lon': [. ..]} ' – fahrradlaus

+0

downvoted wegen einer unvorsichtigen antwort.die idices sind nicht von einer wie er logitude richtig macht.kann es noch schlimmer machen sie verlängern ihre antwort mit der behaupte ein iterator wurde zweimal konsumiert .. – stefan

+0

ich denke ihre antwort ist in ordnung plus eins für die Pflege bei der Bearbeitung –

2

Sie Satz Verständnis mit und um das Set zu einem Schlüssel zu befestigen. Das Problem damit ist dreifach:

1) Sie gehen zweimal durch Ihren Leser.

2) Sätze sind ungeordnet.

3) Stellt nur Speicher 1 Kopie der Wert

Try this:

output2 = {'lat': [], 'lon': []} 
with open('secondhand_data.csv', 'rb') as f: 
    reader = csv.reader(f, delimiter=';') 
    for row in reader: 
     output2['lat'].append(row[7]) 
     output2['lon'].append(row[6]) 
2

Sie mag es einfach tun können:

dct = {'lat': [], 'lon': []} 
with open('secondhand_data.csv', 'rb') as f: 
    reader = csv.reader(f, delimiter=';') 
    for row in reader: 
     dct['lat'] += list(row[7]) 
     dct['lon'] += list(row[6]) 
+0

Würde dies nicht einfach dazu führen, dass jeder Schlüssel eine Liste enthält, die die Spaltenwerte nur der letzten Zeile enthält? –

+0

@AlanLeuthard ja du hast Recht! Ich werde jetzt bearbeiten, mein Bad haha ​​ –

+0

Also was ist eine effizientere Möglichkeit, zu einer Liste hinzuzufügen? Mit dem Operator + oder mit append/extend? –

Verwandte Themen