Python Importfunktion für Numpy

Tenferenzu

Vice Admiral
Registriert
Okt. 2017
Beiträge
6.519
Liebes Forum,
ich benötige mal wieder euer Schwarmwissen (oder zumindest das von @madmax2010 welcher mir schon verdammt oft geholfen hat, danke schonmal).

Ich möchte eine Funktion definieren die den Import von CSV Dateien übernimmt ohne dann tausende Variablen im Variablenexplorer zu haben und um nicht mehrere Seiten an quasi gleichem Code zu haben der eh immer das Gleiche erledigt, allerdings komme ich hier nicht ganz weiter beim zurückreichen der Variablen in den Hauptteil des Programms.

Das zweite Problem das ich habe ist, dass in Zeile 5 die Werte immer geprintet werden. Den Code habe ich so bei einem Beispiel auf Stackoverflow gefunden und es funktioniert auch.. aber es werden halt die Werte immer wieder geprinted. Hat hier ev. auch jemand eine Idee wie man das lösen könnte?

Python:
def csvimporttonumpy(varname):
    with open('%s' % varname) as masscsvimport:  # imports csv as list
        variable8 = csv.reader(masscsvimport, delimiter=',')
        for row8 in variable8:
            print(','.join(row8))
    startlist8 = []

    for p in row8:
        tempfloat8 = float(p)
        startlist8.append(tempfloat8)
    '%s' % varname == numpy.array(startlist8)
    return(varname)

csvimporttonumpy('mass.csv')

Also die Funktion soll den String oder zumindest den Teil vor dem .csv als Eingabe verwenden um dann ein Numpy Array mit dem Namen der Eingabe zurückzugeben.

Danke schonmal für eure Hilfe!
 
Wieso suchst du nicht erstmal nach Lösungen die NumPy dir anbietet:

https://blog.finxter.com/how-to-convert-a-csv-to-numpy-array-in-python/

Ich glaube da wirst du fündig ;) Ich hoffe du bist nicht Englisch-scheu.

Und zur Zeile 5:

Einfach print weglassen und den restlichen Code so an eine Variable übergeben. Dann wird auch nichts ausgegeben.

Denn auch das:

Code:
foo = ','.join(row8)

ist valide.
 
Zuletzt bearbeitet:
hmm.. ich verstehe dein Problem leider nicht, daher kann ich nicht den exakten Code liefern :D

Aber schau mal hier: https://pastebin.com/NyLx9Zw6

Schau dir den Output an, vll ist eines der 3 Zeilen, der Output den du suchst :P
 
ColdGlow schrieb:
Schau dir den Output an, vll ist eines der 3 Zeilen, der Output den du suchst :p
Hmm, #1 und #3 geben mir das gleiche Ergebnis, allerdings bekomme ich die Variable noch nicht aus der Funktion raus und die Apostrophe(n?) müssten noch weg da das alles float sein soll.

Die Variable sollte dann z.B.
Code:
mass
ohne .csv sein mit dem Inhalt von #1 oder #3 ohne ' .

Momentan verwende ich diesen Code zum Importieren:
Python:
with open('mass.csv') as masscsvimport:  # imports csv as list
    variable8 = csv.reader(masscsvimport, delimiter=',')
    for row8 in variable8:
        print(','.join(row8))
startlist8 = []

for p in row8:
    tempfloat8 = float(p)
    startlist8.append(tempfloat8)
mass = numpy.array(startlist8)

Das Testfile heißt in dem Fall mass.csv und hat folgenden Inhalt:
Python:
1,1,2,2,2,2,2,2,2,1,1,1,1,1,1

Damit bekomme ich das hier:
Python:
print(mass)
[1. 1. 2. 2. 2. 2. 2. 2. 2. 1. 1. 1. 1. 1. 1.]
 
Zuletzt bearbeitet:
ok, also ich denke das ist der Output den du suchst:

https://pastebin.com/HcbzhRQN

Alle "prints" muss du ansehen als Varianten zum Zugriff..

Als Beispiel habe ich mass.csv noch eine 2. Zeile hinzugefügt, die sieht jetzt so aus:

1,1,2,2,2,2,2,2,2,1,1,1,1,1,1
1,1,2,2,2,2,2,2,2,1,1,1,1,1,2


Und Output ist das:

Code:
[1 1 2 2 2 2 2 2 2 1 1 1 1 1 1] # Vom ersten Print

[1 1 2 2 2 2 2 2 2 1 1 1 1 1 1] # Print in for
[1 1 2 2 2 2 2 2 2 1 1 1 1 1 2]

[1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2] # Das ist eine zusammengesetze

weil ich denke mal, dass du in der csv wohl nicht nur eine zeile haben wirst oder?

Mit Pandas geht das was du haben willst eig. direkt
 
ColdGlow schrieb:
weil ich denke mal, dass du in der csv wohl nicht nur eine zeile haben wirst oder?
Aktuell schon. Später soll es ev. nochmal 2D bzw. 3D werden aber vorerst bleibe ich bei 1D^^

Ja, Pandas ist mir bekannt.

Der Code löst mein Problem allerdings noch nicht. Ich wrüde gerne meiner Funktion als Parameter den Dateinamen vor dem .csv übergeben und sie soll mir dann als Numpy array mit eben diesen Namen zurückgeben. Verstehst du was ich meine?

Input = mass (ohne .csv)
Output = mass als Numpy array

Daher dachte ich an sowas in die Richtung
Python:
def csvimporttonumpy(varname):
    with open('%s.csv' % varname) as csvimport:  # imports csv as list
        variable8 = csv.reader(csvimport, delimiter=',')
        for row8 in variable8:
            print(','.join(row8))
    startlist8 = []

    for p in row8:
        tempfloat8 = float(p)
        startlist8.append(tempfloat8)
    varname = numpy.array(startlist8)
    print(varname)  # <- Hier bekomme ich die richtigen Daten
    return(varname)

Das print(varname) gibt mir zwar den richtigen Output allerdings bekomme ich das array nicht aus der Funktion raus damit ich es im Hauptteil des Programms verwenden kann.

Momentan bekomme ich das hier als Output, allerdings kann ich den Output nicht als Variable/Array aufrufen bzw. weiß nicht wie ich das dann verwendne könnte.
Python:
csvimporttonumpy('mass')
1,1,2,2,2,2,2,2,2,1,1,1,1,1,1
[1. 1. 2. 2. 2. 2. 2. 2. 2. 1. 1. 1. 1. 1. 1.]
Out[42]: array([1., 1., 2., 2., 2., 2., 2., 2., 2., 1., 1., 1., 1., 1., 1.])

Danke schonmal für deine Geduld.
 
Zuletzt bearbeitet:
Oh Gott, danke, du bist ein Lebensretter. An das habe ich gar nicht gedacht, dass man das so auch machen könnte!

Tausend Dank!

Für den Fall der Fälle, dass jemand das gleiche Problem hat und die Pastebins nicht mehr funktionieren/da sind hier der gesamte Programmteil:
Python:
def csvimporttonumpy(varname):
    with open('%s.csv' % varname) as csvimport:  # imports csv as list
        variable3 = csv.reader(csvimport, delimiter=',')
        for row3 in variable3:
            foo = ','.join(row3)  # wird nur für .join verwendet, ansonsten nutzlos, MUSS aber da sein!!
    startlist3 = []

    for p in row3:
        tempfloat3 = float(p)
        startlist3.append(tempfloat3)
    varname = numpy.array(startlist3)
    # print(varname)
    return(varname)

mass = csvimporttonumpy('mass')
 
Dennoch solltest du dir Pandas anschauen, das ist schon ein tolles Stück Software, das einem hilft nicht 1000 Zeilen Code für ein xy Problem zu verschwenden ;)
 
  • Gefällt mir
Reaktionen: Tenferenzu
Wenn foo nicht benötigt wird, kannst du auch _ = ','.join(row3) oder einfach nur ','.join(row3) schreiben.

Davon abgesehen, hast du mal überprüft ob das Verhalten bei 2 oder mehr Zeilen in der csv tatsächlich das gewünschte ist?

Ich verstehe immer noch nicht, warum nicht einfach
Python:
def csvimporttonumpy(file_name):
    return np.loadtxt(f'{file_name}.csv', delimiter=',')
verwendet wird? Wenn dies das einzige Problem war:
Tenferenzu schrieb:
Das Problem hier war, dass die Daten in Spalten eingelesen werden und nicht in Zeilen und dann der ganze restliche Code nicht mehr funktioniert
dann lässt sich das doch mit Leichtigkeit durch numpy.transpose(), numpy.ravel() oder numpy.reshape() lösen, je nach erforderlichem Endformat.
 
So, die nächste Frage zu dem Thema:

Gibt's eine Möglichkeit wie ich z.B. auf einen Ordner namens 'input' zugrife in dem die ganzen Dateien liegen?
Einfach den Pfad einzufügen hat nicht wirklich geklappt^^
Python:
import numpy
import csv

def csvimporttonumpy(varname):
    with open('input/%s.csv' % varname) as csvimport:  # imports csv as list
        variable3 = csv.reader(csvimport, delimiter=',')
        for row3 in variable3:
            foo = ','.join(row3)  # wird nur für .join verwendet, ansonsten nutzlos, MUSS aber da sein!!
    startlist3 = []

    for p in row3:
        tempfloat3 = float(p)
        startlist3.append(tempfloat3)
    varname = numpy.array(startlist3)
    return(varname)

mass = csvimporttonumpy('mass')

ChristianG. schrieb:
dann lässt sich das doch mit Leichtigkeit durch numpy.transpose(), numpy.ravel() oder numpy.reshape() lösen, je nach erforderlichem Endformat.
Danke schonmal! Ich kuck' mir das mal an sofern es notwendig sein sollte :) Die Importfunktion ist im Vergleich zu den numerischen Iterationen glücklicherweise quasi nicht Leistungsrelevant da eh nur einzelne Zeilen eingelesen werden. Beim Output kann das schon anders aussehen da die Textfiles tlw. mehrere hundert MB groß sind aber da sind sie dann sowieso schon immer im richtigen Format.

Wobei.. zum ausgeben von Plots muss ich die Daten ja auch wieder einlesen hmmm...


Edit: Hat sich erledigt. Es funktioniert.. nur sollte man nicht vergessen, dass temp.py nicht im gleichen Ordner ist wie das eigentliche File mit dem ich arbeite... :freaky:
 
Zuletzt bearbeitet:
Tenferenzu schrieb:
Einfach den Pfad einzufügen hat nicht wirklich geklappt^^
Python:

Nur mal auf die schnelle mit pandas gebastelt.
Liest eine CSV Datei ein, trennt nach komma.

Wenn die Datei nur eine Zeile hat, wird dir die Zeile als float array ausgegeben.
Bei mehreren Zeilen bekommst du eine Liste von Float Array listen. (Eine Liste pro zeile, zusammengefasst in einer Liste)

Schnell, einfach, und zielgerichtet.
Da muss man sich nicht mit den manuellen einlesen von Daten und doppelten iterieren rumschlagen.

Du solltest dir außerdem angewöhnen aussagekräftige Variablennamen zu verwenden. Andere, und auch du werden dir danken, wenn man nach einer Zeit den Code wieder verstehen will!

Python:
# coding: cp1252
import pandas as pd

Singleline = r"Single.csv"
Multiline = r"Multi.csv"

def read_csv_lines_as_floats(filename: str) -> list:
    """
    Read a CSV file and interpret each lines values as floats.
    
    Returns a list of floats for each line.
    
    Args:
        filename (str): The path to the CSV file.
        
    Returns:
        list: If the CSV file contains a single line, returns a list of floats.
              If the CSV file contains multiple lines, returns a list of lists,
              where each inner list represents a row of floats.
    """
    data = pd.read_csv(filename, header=None, sep=',')
    
    if len(data) == 1:
        return data.values[0].astype(float).tolist()
    else:
        result = []
        for _, row in data.iterrows():
            result.append(row.astype(float).tolist())
        return result
    

single_line_result = read_csv_lines_as_floats(Singleline)
print(f"single Line CSV:\n{single_line_result}")

Multi_line_result = read_csv_lines_as_floats(Multiline)
print(f"Multi Line CSV:\n{Multi_line_result}")

Single.csv:
Code:
1,1,1,1,1,1,1,1,1,1,1,1,1,1

Multi.csv:
Code:
1,1,1,1,1,1,1,1,1,1,1,1,1,1
2,2,2,2,2,2,2,2,2,2,2,2,2,2

Output:
Code:
single Line CSV:
[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
Multi Line CSV:
[[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0]]
 
Zurück
Oben