isd Datei einlesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Frkners
User
Beiträge: 4
Registriert: Freitag 19. November 2021, 20:55

Hallo zusammen,

ich bekomme bei folgendem Code ständig eine Fehlermeldung. Kann mir jemand vielleicht weiterhelfen? Vielen Dank im Voraus!
Bild
Benutzeravatar
noisefloor
User
Beiträge: 4195
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Frkners
User
Beiträge: 4
Registriert: Freitag 19. November 2021, 20:55

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
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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).
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Frkners
User
Beiträge: 4
Registriert: Freitag 19. November 2021, 20:55

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
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten