Probleme bei Datei auslesen bzw. Inhalt anzeigen

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
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie sieht denn so eine Datei aus und *was* davon willst Du haben?

Deine Formatierung wirkt falsch - ist das ein Copy & Paste Fehler? Einrückungen spielen in Python ja eine wichtige Rolle! Nimm einfach vier Spaces und schon hast Du keine Probleme mehr (weder beim Bearbeiten in verschiedenen Editoren noch beim Posten hier ;-) )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Ratespiel mit Sirius3 :wink:

Zeile 95 is so besonders da der Name des Empfängers steht
Genauso für 96, 97 und 98 aber das is erst mal zweitrangig

Ich denke mal du willst auf String oder Integer hinaus?
Die Leerzeichen sehen so aus: O S X 1

Edit:

Hyperion hier im Forum is es gerade ein Copy & Paste fehler
BlackJack

@Kalli87: Beantworte doch einfach mal die Fragen. Welchen Wert und welchen Typ haben die angesprochenen Objekte. Überprüfe die Antworten auf die Fragen in dem Du Dir Werte und Typen ausgeben lässt. Wenn Du etwas anderes anderes antwortest als der Interpreter dann denke darüber nach wo und warum Du falsche Annahmen getroffen hast und wie es richtig aussehen müsste.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@BlackJack
Die Frage konnte ich einfach nicht beantworten aber ich denke mal ich lag richtig mit der Annahme das Siruis3 darauf hinaus wollte ob es sich um Integer oder um einen String handelt.
Ich bin dem nachgegangen hab es in einem String umgewandelt und alles replaced was ich nicht brauche und schon funktioniert es.
Sicherlich gibt es wieder eine elegantere Lösung als meine aber wie man so schön sagt: Viele Wege führen nach Rom :wink:
BlackJack

@Kalli87: Wieso kannst Du die Frage nicht beantworten? Du hast die Daten, Du hast das Programm, Du kannst Dir die gefragten Informationen doch ganz einfach ausgeben lassen‽

Und nein, das hat nichts mit Integern zu tun, und was immer Du da auf einer Zeichenkettenrepräsentation am Ende anstellst ist das nachträgliche hässliche zurechthacken von etwas was überhaupt nur besteht weil Du vorher schon etwas machst was keinen Sinn ergibt. Das hat an dieser Stelle schon nichts mehr mit ”unelegant” zu tun, das würde ich schlicht als Programmfehler ansehen.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@BlackJack: Gut dann erkläre mir mal bitte wie du einen Datei ausließt die ca. 250 Zeilen aus Symbolen, Buchstaben und Zahlen besteht und nur bestimmte Zeilen brauchst um weiter zu kommen bei deinem Vorhaben. Dann triffst du auf das gleiche Problem wie ich mit der Ausgabe.
Zeige mir einfach mal ein Stückchen Code wie du das ganze problem lösen würdest und erkläre mir bitte warum du es gerade so machst.
Sirius3
User
Beiträge: 17793
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: Programmieren hat nichts mit Raten zu tun. Wenn Du nicht weißt, welche Datentypen Du erzeugst, kannst Du auch nicht sinnvoll damit arbeiten. Wenn Du nicht weißt, was eine Variable enthält, kann man mit "print(type(variable))" z.B. ihren Typ ausgeben lassen. "name" ist bei Dir eine Liste. "self.test" auch. Das ist relativ leicht herauszufinden, weil sie mit "[]" initialisiert werden. Aber was steht in den Listen?
Beschreibe mal in Worten, was der Inhalt von "name" sein soll.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Na im "name" stehen halt die Sachen drinnen die ich mir aus der Datei geholt habe, in diesem Fall die Namen der Empfänger.
Und so is es auch.

Edit:
Nur sieht "name" so aus: 1010;EXPORT_NAME1;Zum OSX1
Und "self.test" so: OSX1
BlackJack

@Kalli87: Ohne zu wissen wie die Datei aufgebaut ist und welche Informationen daraus extrahiert werden sollen kann Dir *niemand* konkreten Quelltext dafür zeigen.

Darum geht es hier doch auch gar nicht. Du hast Quelltext gezeigt bei dem ganz offensichtlich etwas sehr unsinniges gemacht wird. Was dann später anscheinend zu Leerzeichen führt die da nicht wären, wenn am Anfang nicht schon die Daten falsch behandelt werden. Und statt da am Ende dann Leerzeichen zu entfernen, sollte man die vielleicht besser gar nicht erst einfügen. Dann bräuchte man keine Probleme lösen die man selber geschaffen hat.

Es ist ja okay das man Fehler macht oder Code nicht versteht, das geht jedem mal so. Was nicht geht ist das man weiss das man etwas nicht verstanden hat, das aber ignoriert und später am Ergebnis auf Zeichenkettenebene herumdoktort, statt den *eigenen*, selbst geschrieben Code tatsächlich zu verstehen. So kann man nicht programmieren, in dem man nur im Neben rumstochert und blind durch seinen Code stolpert, und dabei offenbar absichtlich fest die Augen verschliesst.

Code operiert mit Werten, diese Werte haben jeweils einen Typ, und der Typ bestimmt welche Operationen mit dem Wert möglich sind, und was das Ergebnis oder der Effekt davon ist. Und man muss, zumindest bei selbst geschriebenen Code, sagen können welchen Wert und Typ die jeweiligen (Zwischen)Ergebnisse haben. Denn nur dann kann man sinnvoll und gezielt Code entwickeln der aus gegeben Eingangswerten (zum Beispiel ein Pfad/Dateiname als Zeichenkette) zu dem gewünschten Endergebnis (Wert/Typ) führt. Wenn man das nicht sagen kann, wonach wählt man denn in jedem Zwischenschritt zum Ziel aus, welche Operationen man auf dem jeweiligen Zwischenwert(en) ausführt‽ Was hast Du Dir zum Beispiel bei den Zeilen 4 bis 6 gedacht? Welchen Wert/Typ hat `export_name` und welchen Wert/Typ hat demzufolge `name` nach diesen Zeilen? Und *warum* hast Du das so gemacht?
Sirius3
User
Beiträge: 17793
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: ist es nun so oder nicht, dass da Empfängernamen in "name" stehen?
Ganz offensichtlich enthalten "name" und "self.test" nicht das was Du hier behauptest, wenn Du den Quelltext, den Du hier gepostet hast, verwendest. Das sind nämlich Listen und Du hast Strings in Deinem Edit.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Was ich mir bei Zeile 4 und 6 gedacht habe? Na ich hab mir einfach eine leere Liste angelegt, hab diese dann mit der Zeile 95 befüllt und in Zeile 6 hab eine weitere leere Liste angelegt die ich dann mit den einzelnen Werten aus der vorhergehenden Liste befülle. (Das jetzt hier der Code ein Copy&Paste-Fehler is haben wir ja schon geklärt.)

Um auf deinen restlichen Text weiter ein zugehen fehlen mir eher gerade die Worte aber nicht weil ich beleidigt bin oder ähnliches sondern einfach weil ich nicht weiß was ich drauf antworten soll.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Kannst Du uns nicht einmal Auszüge einer solchen Datei posten? (Bitte in die "neutralen" Code-Tags setzen!)

Irgend wie habe ich den Verdacht, dass das CSV-Dateien sind... und die kann man recht einfach parsen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@Sirius3
Is gut dann halt so damit du zufrieden bist
name: ['1', '0', '1', '0', ';', 'E', 'X', 'P', 'O', 'R', 'T', '_', 'N', 'A', 'M', 'E', '1', ';', 'Z', 'u', 'm', ' ', 'O', 'S', 'X', '1', '\n']
selft.test: ['O', 'S', 'X', '1']
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@ Hyperion
# DUMP
0101;MDCMDUMP;1
# posql 01XX
0201;HEIMAT;
0202;RC_PFAD;
0203;BINSH_PFAD;
# DICOM 02XX
0301;CDROM;
0302;DICOM_PFAD;
0303;LINK_DIR;
0304;DICOM_IMPORT;
0305;DICOM_IMPORT_EXT;
0306;KH_LINK_DIR;1
0307;KH_LINK_DIR;
0308;MAKE_LINK_MQUERY;1
0309;MQUERY_LINK_DIR;
0401;EXPORT_STATION1;befund1
0402;EXPORT_STATION2;befund2
0403;EXPORT_STATION3;befund3
0404;EXPORT_STATION4;befund4
0405;EXPORT_STATION5;befund5
0406;EXPORT_STATION6;befund6
# Backup
0420;EXPORT_BACKUP_KENNZ;0
# Telerad
0430;EXPORT_TELERAD_KENNZ;0
0431;TELERAD_PFAD;
0440;TELERAD_DIREKT;0
# CP für Datensicherung
0501;CP_NACH_CD_DIR;1
# LINK
0601;MAKE_LINK;1
0610;LINK_EXPORT;1
0611;LINK_BEFUND1;befund1
#0612;LINK_BEFUND2;befund2
#0613;LINK_BEFUND3;befund3
#0614;LINK_BEFUND4;befund4
#0615;LINK_BEFUND5;befund5
#0616;LINK_BEFUND6;befund6
0620;LINK_BACKUP;backup
# anzeige in AL
0701;MR_IN_AL;1
0702;CT_IN_AL;1
0703;CR_IN_AL;1
0704;MG_IN_AL;1
0705;DX_IN_AL;1
0706;US_IN_AL;1
0707;NX_IN_AL;1
0708;NM_IN_AL;1
0709;RF_IN_AL;1
0710;SC_IN_AL;1
# löschen
0801;ERLAUBE_LOESCHEN;0
0802;LOESCHE_CAL;0
0803;LOESCHE_CAL_MOD;S
# Viewer
# 1600x1200
# 0900;07_AKTIV;1 # Meditec-Viewer wird geladen F4
# 0901;DUAL_KENNZ;1 # 2 BS
# 0902;VIEW_XD0;2000 # Groesse X
# 0903;VIEW_YD0;1450 # Groesse Y
# 0904;ADD_XD0;2048 # ADD_X * Virtuelle BS
# 0905;VIEW_XD1;2000 # Groesse X
# 0906;VIEW_YD1;1450 # Groesse Y
# 0907;ADD_XD1;2048 # ADD_X * Virtuelle BS
0900;07_AKTIV;1
0901;DUAL_KENNZ;0
0902;MAX_DISPLAY;8
0903;MAX_VIEWER;8
0904;DISPLAY_RECHTS;:0.1
0910;VIEW_XD0;1280
0911;VIEW_YD0;920
0912;ADD_XD0;1280
0913;VIEW_XD1;1260
0914;VIEW_YD1;920
0915;ADD_XD1;1280
# BB hochkant
#0900;07_AKTIV;1
#0901;DUAL_KENNZ;1
#0902;MAX_DISPLAY;8
#0903;MAX_VIEWER;8
#0904;DISPLAY_RECHTS;:0.1
#0910;VIEW_XD0;1200
#0911;VIEW_YD0;1490
#0912;ADD_XD0;1200
#0913;VIEW_XD1;1200
#0914;VIEW_YD1;1490
#0915;ADD_XD1;1200
# export_mod für Zeile 24
1000;EXPORT_STATION;1
1001;EXPORT_MOD1;OX
1002;EXPORT_MOD2;--
1003;EXPORT_MOD3;--
1004;EXPORT_MOD4;--
# ersatz für Empfänger.txt
1010;EXPORT_NAME1;Zum OSX1
1011;EXPORT_NAME2;Zum MR
1012;EXPORT_NAME3;Zum LEO
1013;EXPORT_NAME4;Zum VIA
#
1020;EXPORT_AET1;osirix1
1021;EXPORT_AET2;MRC37731
1022;EXPORT_AET3;SYNGOVIA
1023;EXPORT_AET4;SYNGOVIA
#
1030;EXPORT_IP1;
1031;EXPORT_IP2;
1032;EXPORT_IP3;
1033;EXPORT_IP4;
#
1040;EXPORT_PORT1;
1041;EXPORT_PORT2;
1042;EXPORT_PORT3;
1043;EXPORT_PORT4;
1050;MDCMSEND;1
# Export für AS
1101;OEHM;0
1102;EFILM;0
1103;EFILM_CONFIG_DATEI;EEmpfaenger.txt
# RIS
1201;PATNU_FUER_RIS;1
1202;PATNU_FUER_KIS;0
1203;PATNU_FUER_VIEWER;0
1204;RIS_IP;
1205;RIS_LID;c0
# Patordnerschema
1301;PATORDNER_SCHEMA;1
# schreibe LOG für dicom_import
1401;IMPORTLOG;0
1402;IMPORTLOG_DATEI;
# Datenbank
# abgleich mit PG_HOST
1500;PG_HOST;
1501;KENNZ_PG_HOST;0
1502;ABGLEICH_AL;0
1503;ABGLEICH_IMPORT;0
# RIS Vorbefunde
1601;LESE_RIS_VORBEFUNDE;0
# FARBE
1701;FARBSTATUS;1
1702;FARBE;0
# MASC
1800;MASC_ARCHIV_PFAD;/MASC/DB_MASC_ARCHIV
1801;LESE_MASC;0
1805;MDCMSEND_MASC_BEFUND;0
1810;IP_MASC_BEFUND;
1811;PORT_MASC_BEFUND;
1812;AET_MASC_BEFUND;JIVEX
# TELERAD_RSYNC
2000;RSYNC;0
2001;RSYNC_SERVER;
2002;RSYNC_QUELLE;
2003;RSYNC_ZIEL;
# Zeile F5
3000;ZEILE_F5;1
3001;MODUS_F5;1
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, es ist also kein Standard-CSV, sondern ein "krudes" proprietäres Format... oder kennt das jemand? :K

Dennoch sieht es ja an sich erst einmal nicht schwer zu parsen aus. Man müsste jetzt wissen, *was* Du davon haben willst.

Wie sieht denn Dein Ansatz dazu aus?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@Hyperion: Mein Ansatz hab ich doch schon gepostet und was ich brauche steht hier in der Datei bei 1010 - 1043.
Ich hab die Datei geöffnet hab die Zeilen zählen lassen hab sie mir anzeigen lassen, danach alles in eine liste gespeichert.
Da alles nummeriert war durch enumerate konnte ich mir so auch die Zeile merken und verwenden um dann alles weitere zu erledigen.

Einen besseren Ansatz hatte ich bis jetzt nicht
Zuletzt geändert von Kalli87 am Donnerstag 26. März 2015, 11:35, insgesamt 1-mal geändert.
BlackJack

@Hyperion: Den Ansatz haben wir doch schon gesehen. Die gewünschte Information steht in Zeile 96 in den Zeichen 23 bis 27.

@Kalli87: Ich denke nicht dass das *so* funktioniert beziehungsweise *so* gelöst werden soll dass Du Daten anhand ihrer absoluten Positionen aus der Datei extrahieren sollst. Das ist doch total unflexibel weil die gleichen Informationen in anderen Dateien doch *sehr* wahrscheinlich nicht an den gleichen absoluten Positionen stehen werden. Damit wäre so ein Programm total sinnfrei, weil man dann schneller und einfacher die Informationen mit einem Texteditor manuell extrahieren könnte.

Woher weisst Du denn das 'OSX1' die Information ist die Du haben möchtest? Dafür muss es doch irgendein Entscheidungskriterium geben.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@BlackJack
Es handelt sich dabei um eine Config Datei und warum ich diese Zeilen absolut anspreche ist das mein Chef hier im Praktikum versichert hat das ich diese Zeilen nur brauche! ansonsten bleibt die Datei so wie sie is. Maximal werden werte verändert aber keine gelöscht oder hinzugefügt.
Sirius3
User
Beiträge: 17793
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: es ist doch offensichtlich, dass die Datei aus Kommentaren, und Zeilen mit ID;NAME;Wert besteht.
Um also mit den Daten arbeiten zu können, wäre es ja sinnvoll, die Datei so zu parsen, dass die Kommentare entfernt werden und die ID, bzw. der Name als Schlüssel zu den Werten gespeichert werden.

Nochmal zu Deiner Antwort auf meine Frage: Willst Du tatsächlich jedes einzelne Zeichen als ein Eintrag in einer Liste haben? Und um auf Deine ursprüngliche Frage zurückzukommen: wo sind hier Leerzeichen?
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@Sirius3
denke mal die Leerzeichen entstehen wenn ich "print(*self.test)" schreibe
Natürlich will ich nicht jedes einzelne Zeichen als Eintrag in einer liste haben.

Dann verrate mir mal bitte wie ich die Datei einlesen muss damit ich nur die Werte verwenden kann die ich wirklich haben will. Weil ich weiß jetzt schon das meine Variante früher oder später Fehler aufweisen wird und dann nichts mehr geht.
Antworten