.csv Trennzeichendilemma

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.
Benutzeravatar
kbr
User
Beiträge: 1155
Registriert: Mittwoch 15. Oktober 2008, 09:27

Donnerstag 28. Juni 2018, 18:29

@Hans-Uwe: In Deinem Beispielcode verwendest Du nicht das csv-Modul zum Lesen der Daten, sondern interpretierst das csv-Format selbst. Und dabei berücksichtigst Du nicht die Quotation-Marks ("), welche die Separatoren innerhalb einer Zelle schützen.
Sirius3
User
Beiträge: 12253
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 28. Juni 2018, 18:33

@Hans-Uwe: Du liest ja die Werte auch nicht mit dem csv-Modul ein, sondern machst irgendwas von Hand, was dann auch nicht so funktioniert, wie Du denkst. Das hat __blackjack__ ja schon erklärt, dass man irgendwie kennzeichnen muß, dass das ; kein Trennzeichen ist, sondern ein Wert.

Zeilen wie »import os as os« ist das as ja quatsch, und bei den anderen Imports ist fraglich, warum da Module kryptisch abgekürzt werden.
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Donnerstag 28. Juni 2018, 18:34

Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Donnerstag 28. Juni 2018, 18:42

Diese Ein- und Auslesezeilen habe ich aus einem Youtube Tutorial. :roll:
kbr hat geschrieben:
Donnerstag 28. Juni 2018, 18:29
Und dabei berücksichtigst Du nicht die Quotation-Marks ("), welche die Separatoren innerhalb einer Zelle schützen.
Wie kann man die Quotationmarks denn in meinem Fall berücksichtigen? Ich lese ja aus einer Zelle und Python macht dann daraus einen String. Ich wüsste jetzt nicht wie ich darauf Einfluss nehmen soll...
Sirius3 hat geschrieben:
Donnerstag 28. Juni 2018, 18:33

Zeilen wie »import os as os« ist das as ja quatsch, und bei den anderen Imports ist fraglich, warum da Module kryptisch abgekürzt werden.
Ist Vorgabe von dieser bescheuerten Software-Erweiterung PyZDDE.
Sirius3
User
Beiträge: 12253
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 28. Juni 2018, 18:44

Nein, das sind keine Vorgaben von PyZDDE.

Wie sind denn Deine csv-Import und -Exporteinstellungen in Excel?
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Donnerstag 28. Juni 2018, 19:23

Sirius3 hat geschrieben:
Donnerstag 28. Juni 2018, 18:44
Wie sind denn Deine csv-Import und -Exporteinstellungen in Excel?
Keine Ahnung. In den erweiterten Excel-Optionen finde ich dazu nichts. Google hilft mir auch nicht weiter. Hast du einen Tipp wo ich gucken muss?
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Freitag 29. Juni 2018, 12:19

Kann mir jemand helfen?

Ich habe es jetzt hinbekommen, dass die Auslesezelle 1,2,1; so bestehen bleibt. Jetzt werden aber die Zellen daneben mit jedem Scriptdurchlauf mit immer mehr werdenden Anführungsstrichen gefüllt. Außerdem werden noch Zellen in einem ganz anderen Teil der Tabelle mit Anführungsstrichen gefüllt. Siehe Screenshots:

https://ibb.co/ga53CJ
https://ibb.co/guyyCJ

Ich kann nicht erkennen, wo mein Code so falsch ist, dass so ein ungewollter Quatsch passiert.

Code: Alles auswählen

###Write Data
werte[16][3] = power

with open('H:\\Simulation\\Phosphor_Kennwerte1.csv', 'wb') as f:
    writer = csv.writer(f, delimiter=';')
    writer.writerows(werte)
__deets__
User
Beiträge: 8296
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 29. Juni 2018, 12:30

Das reicht nicht, um das Problem nachvollziehen zu koennen. Aber es klingt so, als ob du die Daten falsch einliest, ohne das dort die Anfuehrungszeichen beachtet werden. Um sie dann *mit* Anfuehrungszeichen zu speichern. Dadurch pumpen die sich auf.

Wie liest du denn die Datei ein?
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Freitag 29. Juni 2018, 12:42

Ja, das wurde mir gestern auch schon gesagt, aber ich weiß nicht wie man das macht. So lese ich aus:

Code: Alles auswählen

### read Data
dateihandler = open('H:\\Simulation\\Phosphor_Kennwerte1.csv')

inhalt = dateihandler.read()

werte = []

zeilen = inhalt.split('\n')

for i in range(len(zeilen)):
    spalten = zeilen[i].split(';')
    werte.append(spalten)

##Phosphor Properties
particleindex = float(werte[3][3])
wavelengthshift = str(werte[11][3])
Ich dachte, dass ich mit dem str() schon angebe, dass der Inhalt der Zelle ein String ist und auch bleiben soll.
Benutzeravatar
__blackjack__
User
Beiträge: 6404
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 29. Juni 2018, 12:54

Dann lies das nicht so aus. Für CSV gibt es das `csv`-Modul.

Und der einzige `str()`-Aufruf im gezeigten Quelltext hat rein gar nichts mit dem Problem zu tun. An der Stelle hast Du schon falsche Werte in `werte`, weil das einfache Aufteilen an ';' nicht funktioniert, denn an ';' innerhalb von doppelten Anführungszeichen darf nicht aufgeteilt werden.
long long ago; /* in a galaxy far far away */
__deets__
User
Beiträge: 8296
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 29. Juni 2018, 12:55

Noe. Du liest CSVs selbstgefrickelt ein, und beim schreiben benutzt du einen CSV-writer, der eine ganze Reihe von "magischen" Dingen fuer dich tut, wie zB einen waehlbaren Delimiter zu benutzen, und eben auch Leerstrings in Anfuehrungszeichen verpackt, oder zB wenn der delimiter im String vorkommt - um das zu unterscheiden von einem gewollten Delimiter.

Da du auf diese Annehmlichkeiten beim einlesen verzichtest, und einfach gar nix machst, werden diese Regeln beim einlesen nicht angewandt, und du endest mit '""' (beachte die einfachen Anfuehrungszeichen UM die doppelten - ein String, der zwei Anfuehrungszeichen enthaelt!).

Dadurch das "pumpen". Benutz den analog zum csvwriter konfigurierten csvreader, und alles sollte funktionieren.
Sirius3
User
Beiträge: 12253
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 29. Juni 2018, 13:07

Zum Einlesen in Excel muß man über Daten/AusText gegen, um die erweiterten Optionen zu haben.
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Freitag 29. Juni 2018, 13:46

Habe dieses Beispiel gefunden:

Code: Alles auswählen

import csv

with open('H:\\Simulation\\Phosphor_Kennwerte2.csv', 'rb') as x:
    reader = csv.reader(x, delimiter=';')
    data = list(csv.reader(x))
    print(data[3][3])
Damit bekomme ich einen IndexError. "List index out of range"
__deets__
User
Beiträge: 8296
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 29. Juni 2018, 13:50

Ja, und wie sieht data nun aus? Kann hier ja keiner wissen :K
Hans-Uwe
User
Beiträge: 56
Registriert: Dienstag 16. Januar 2018, 16:26

Freitag 29. Juni 2018, 13:53

data ist die selbe Tabelle, die ich bisher benutzt habe. Normalerweise müsste 1.8 ausgegeben werden.
Antworten