Seite 1 von 1

isd Datei einlesen

Verfasst: Freitag 19. November 2021, 21:03
von Frkners
Hallo zusammen,

ich bekomme bei folgendem Code ständig eine Fehlermeldung. Kann mir jemand vielleicht weiterhelfen? Vielen Dank im Voraus!
Bild

Re: isd Datei einlesen

Verfasst: Freitag 19. November 2021, 21:16
von noisefloor
Hallo,

da ist kein Code... und Code bitte also Code (=Text im Codeblock, zu erreichen über die </> Schaltfläche in der Editorleiste) einfügen, nicht als Bild.

Gruß, noisefloor

Re: isd Datei einlesen

Verfasst: Freitag 19. November 2021, 21:16
von __deets__
Bilder auf deinem Rechner funktionieren nicht. Und Bilder sind eh öde. Bitte deinen Code & die vollständige Fehlermeldung in Code Tags (das ist der </> Knopf im vollständigen Editor) posten.

Re: isd Datei einlesen

Verfasst: Freitag 19. November 2021, 21:22
von Frkners
Das wusste ich nicht sorry! Ich bin neu hier :D Danke für die schnelle Antwort auf jedenfall!!

Code: Alles auswählen

measurementFolder = "Messungen2021-09-02_09-40-32_mit_60_860_20_10_1_AS7264NUV00_000000_oFi_oFo_7nmSpalt_2w"
# wl_data = [360, 850, 1]
wl_data = [360, 850, 0.2]
# wl_data = [360, 850, 0.05]

# import measured spectra and zero pad them to correct start/stop wavelength

spectraFileList = glob.glob(measurementFolder + '/' + '*.isd')
with open(spectraFileList[0], 'r') as f:
    read_data = f.read()
    df = pd.DataFrame([x.split('\t') for x in read_data.split('\n')], columns=['Wellenlaenge', 'Bestrahlungsstaerke'])
    df = df.mask(df.isnull()).dropna()
    # df.to_csv("csvDatei", sep='|', encoding='utf-8', index=False)
    df = df.astype(float).to_numpy()
    df_interp_probe = lx.SPD(df.T).cie_interp(wl_new=wl_data, kind='S', extrap_values=0).get_()[1:, :]
spectralDataArray = np.empty(shape=(len(spectraFileList), df_interp_probe.shape[1]))
for index, item in enumerate(spectraFileList):
    with open(spectraFileList[index], 'r') as f:
        read_data = f.read()
        df = pd.DataFrame([x.split('\t') for x in read_data.split('\n')], columns=['Wellenlaenge', 'Bestrahlungsstaerke'])
        df = df.mask(df.isnull()).dropna()
        # df.to_csv("csvDatei", sep='|', encoding='utf-8', index=False)
        df = df.astype(float).to_numpy()
        df_interp = lx.SPD(df.T).cie_interp(wl_new=wl_data, kind='S', extrap_values=0).get_()[1:, :]
    spectralDataArray[index, :] = df_interp
Fehlercode:

Code: Alles auswählen

Traceback (most recent call last):
  File "/Users/PycharmProjects/pythonProject7/main.py", line 123, in <module>
    read_data = f.read()
  File "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 117: invalid start byte

Re: isd Datei einlesen

Verfasst: Freitag 19. November 2021, 21:40
von __blackjack__
@Frkners: Offenbar ist die Datei, die Du da einlesen möchtest nicht UTF-8 kodiert. Die Kodierung sollte man beim öffnen von Textdateien am besten auch immer explizit angeben. Denn unter einem anderen System oder mit anderen Systemeinstellungen könnte der Code sogar funktionieren, davon sollte das aber nicht abhängig sein.

Davon abgesehen ist das Vorgehen etwas komisch erst den gesamten Text in den Speicher zu lesen, an Zeilenenden zu trennen und dann die Zeilen an Tabulatorzeichen zu trennen. Pandas hat Funktionen um Tabulator getrennte Textdateien einzulesen: `pandas.read_csv()`.

Pfade sind keine Zeichenketten im Sinne von, das man da sinnvoll/sicher mit Zeichenkettenoperationen mit arbeiten könnte. In neuem Code bietet sich das `pathlib`-Modul an um mit Pfaden zu arbeiten. Die `Path`-Objekte hätten dann sogar eine Methode um den kompletten Text zu lesen, wenn man das denn so machen würde.

Die ``with``-Blöcke umfassen zu viel Code. Die Datei wird ja gleich nach der ersten Zeile schon nicht mehr benötigt.

`x` ist kein guter Name für eine Zeile.

Dann sind Typen in Namen problematisch wenn sie falsch sind. Das was da an den Namen `df` gebunden wird sollte dann auch nichts anderes sein als `DataFrame`-Objekte.

Grunddatentypen sollten in Namen gar nicht auftauchen. Das wird im Laufe der Entwicklung gerne mal geändert, und dann hat man falsche, irreführende Namen im Quelltext, oder man muss durch den ganzen Code gehen und alle betroffenen Namen ändern.

Namen werden klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Re: isd Datei einlesen

Verfasst: Freitag 19. November 2021, 21:54
von Frkners
Danke für die ausführliche Antwort :D kann ich die Dateien UTF-8 kodieren? Den Code habe ich von meinem Betreuer bekommen, bei ihm funktioniert dieser auch nur bei mir eben nicht... Ich weiß grade nicht ganz was ich jetzt ändern kann/soll

Re: isd Datei einlesen

Verfasst: Freitag 19. November 2021, 21:59
von __blackjack__
Du kannst die Dateien in UTF-8 umkodieren, oder eben im Programm explizit die richtige Kodierung angeben.

Weitere Anmerkungen:

`item` wird in der ``for``-Schleife gar nicht benutzt. Ist auch kein besonders guter Name.

`split()` mit einem Zeilenendezeichen ist keine gute Idee, denn normalerweise enden Textdateien auch mit einem Zeilenendezeichen, was bei `split()` dazu führt, das am Ende eine leere Zeichenkette entsteht. Die `splitlines()`-Methode hat dieses Problem nicht.

Ungetestet:

Code: Alles auswählen

def main():
    measurement_folder = Path(
        "Messungen2021-09-02_09-40-32_mit_60_860_20_10_1_AS7264NUV00_000000_oFi_oFo_7nmSpalt_2w"
    )
    wl_data = [360, 850, 0.2]

    # import measured spectra and zero pad them to correct start/stop wavelength

    spectra_file_paths = list(measurement_folder.glob("*.isd"))
    spectral_data = np.empty(
        shape=(len(spectra_file_paths), df_interp_probe.shape[1])
    )
    for index, spectra_file_path in enumerate(spectra_file_paths):
        df = pd.DataFrame(
            [
                line.split("\t")
                for line in spectra_file_path.read_text(
                    encoding="utf-8"
                ).splitlines()
            ],
            columns=["Wellenlaenge", "Bestrahlungsstaerke"],
        )
        spectral_data[index, :] = (
            lx.SPD(df.mask(df.isnull()).dropna().astype(float).to_numpy().T)
            .cie_interp(wl_new=wl_data, kind="S", extrap_values=0)
            .get_()[1:, :]
        )


if __name__ == "__main__":
    main()