Integer aus CSV-Datei als Liste einlesen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    ich habe eine CSV-Datei mit Primzahlen. Diese möchte ich gerne in die Liste "Primes" packen, sodass ich mit "Primes[5]" an die 5-te Primzahl komme und auch damit rechnen kann.

    Mein Code bisher:

    Code
    import csv
    primes = []
    with open('primes.csv') as csvdatei:
        csv_reader_object = csv.reader(csvdatei, quoting=csv.QUOTE_NONNUMERIC)
    
        for row in csv_reader_object:
            primes.append(row)

    Nun ergibt mir allerdings "print(primes[5])" die Ausgabe

    Code
    [13.0]

    Wie komme ich nun an die 13?

  • Hallo,

    ich habe das nun mit Pandas versucht und bin zumindest einen Schritt weiter. Fangen wir also hier an:

    Code
    import pandas as pd
    
    primes = pd.read_csv('primesless.csv')
    primes.fillna(0, inplace=True)#NaN durch 0 ersetzen
    primes = primes.astype(int)#Und zu integern konvertieren

    Die .csv sieht so aus

    Die Ausgabe so:


    Meine offenen Fragen sind:

    - wie entferne ich nun die Nullen?

    - wie kann ich nun auf die Zahlen zugreifen, sodass mir also primes[5] die 5-te Primzahl ausgibt? In diesem Falle die 11.

  • Wie waer's damit:

    Code
    import csv
    primes = []
    with open('primes.csv') as csvdatei:
        csv_reader_object = csv.reader(csvdatei, quoting=csv.QUOTE_NONNUMERIC)
    
        for row in csv_reader_object:
            primes.extend( [int(x) for x in row] )

    Das gibt mir:

    Code
    Traceback (most recent call last):
      File "csv_convert.py", line 7, in <module>
        primes.extend( [int(x) for x in row] )
      File "csv_convert.py", line 7, in <listcomp>
        primes.extend( [int(x) for x in row] )
    ValueError: invalid literal for int() with base 10: ''
  • Man könnte auch den CSV-Quatsch lassen wenn man gar keine CSV-Datei hat

    Muss es mit einer CSV nun sein oder nicht, denn

    Ich habe es nun auch mit einer .csv-Datei versucht, in der die Einträge in Zeilen und Spalten stehen. Leider liefert mein Code nur die erste Spalte zurück.

    Ist keine passende Antwort auf die Frage

    ValueError: invalid literal for int() with base 10: ''

    Dann kommt wohl wo eine Zelle mit leeren Inhalt, das muss man (zuvor) filtern.

    EDIT:

    Worauf noch keiner eingegangen ist

    sodass ich mit "Primes[5]" an die 5-te Primzahl

    Index 5 bei Primes bedeutet die 6te Zahl, da bei einem Index mit 0 begonnen wird zu zählen.

  • Ok, das mit dem Index wusste ich eigentlich, hab es hier nur vergessen. Also, primes[n-1] soll mir natürlich die n-te Primzahl ausgeben. Sorry.

    Dann:
    Ich weiß nicht, ob es unbedingt .csv sein muss. Mir würde es natürlich auch genügen wenn ich eine .txt-Datei hätte, in der die Elemente durch einen Delimiter getrennt sind, sei es ein Komma, Semikolon, Zeilenumbruch...

    ich bin jetzt leider sehr durcheinander. Ich weiß, meine Fragen setzen eigentlich mehr Grundwissen voraus, deshalb suche ich immer sehr gezielt.

    Falls es hilft: Ich habe mir jetzt die angehängte .txt-Datei besorgt, da sind die Elemente durch Leerzeichen getrennt.

    Wenn ich die nun also in eine Liste packen könnte, dann wäre ich überglücklich.

  • Und warum hast du das in der Datei?

    Versteh ich nicht.

    Warum überhaupt über eine Datei, du könntest dir die Primezahlen auch selber erstellen, dann kannst du auch leichter dessen Struktur bestimmen

    Sorry, dass ich da vielleicht jetzt ein Durcheinander rein bringe, aber mir erschien deine Datenquelle etwas "beliebig"

  • Die gezeigte Datei kann man mit Numpy (und das hast Du ja wenn Du Pandas hast) wie folgt einlesen:

    Python
    In [387]: np.loadtxt("primes10000.txt", dtype=int, usecols=range(1, 11))        
    Out[387]: 
    array([[     2,      3,      5, ...,     19,     23,     29],
           [    31,     37,     41, ...,     61,     67,     71],
           [    73,     79,     83, ...,    107,    109,    113],
           ...,
           [104417, 104459, 104471, ..., 104527, 104537, 104543],
           [104549, 104551, 104561, ..., 104639, 104651, 104659],
           [104677, 104681, 104683, ..., 104717, 104723, 104729]])

    Und das 2D-Array dann einfach mit `flatten()` ”platt” machen:

    Python
    In [388]: np.loadtxt("primes10000.txt", dtype=int, usecols=range(1, 11)).flatten()                                                                    
    Out[388]: array([     2,      3,      5, ..., 104717, 104723, 104729])

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

    Einmal editiert, zuletzt von __blackjack__ (23. April 2021 um 13:33) aus folgendem Grund: Doppeltes Wort entfernt.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!