Seite 1 von 2
problem mit zeichensatz
Verfasst: Mittwoch 4. Juli 2007, 13:28
von vikingrussel
habe eine datei zum lesen geöffnet, und lese wie folgt aus:
und bekomme das:
ÿþS
anstatt dem was drinsteht. sicherlich ein prob mit dem zeichensatz. wie kann ich es mir richtig ausgeben lassen?
irgendwelche ideen?
MfG VikingRussel
Verfasst: Mittwoch 4. Juli 2007, 13:42
von EnTeQuAk
Hallo!
zieh dir mal folgenden Lesestoff rein:
http://www.python-forum.de/topic-5095.html
und
[wiki]Von Umlauten, Unicode und Encodings[/wiki]
MfG EnTeQuAk
Verfasst: Mittwoch 4. Juli 2007, 13:43
von BlackJack
Wenn Du das bekommst, dann steht auch das drin. Welche Kodierung hat denn der Text in der Datei?
Zeig doch mal was drinsteht, ohne das mehrere Programme zwischen der Datei und unseren Browsern die Daten weiter (falsch) interpretieren können. ASCII ist recht sicher, also zeig mal was ``repr(z)`` ausspuckt.
Verfasst: Mittwoch 4. Juli 2007, 13:43
von vikingrussel
mach ich, danke
Verfasst: Mittwoch 4. Juli 2007, 13:44
von vikingrussel
keine ahnung welche kodierung der text
Verfasst: Mittwoch 4. Juli 2007, 14:35
von vikingrussel
hat sich alles geklärt, danke für die hilfe.
ich würde gleich zum nächsten prob kommen.
und zwar tu ich wie folgt nach einem suchmuster mir etwas heraussuchen:
Code: Alles auswählen
# Öffnen von Log-Datei(en)
logfile = codecs.open('X:\\xxx\\xxx\\xxx\\xxx.log', 'r', 'utf-16')
#Suchmuster
medium = re.compile('^Mediumname:')
drive = re.compile('^Sicherung von')
art = re.compile('^Sicherungsart:')
begin = re.compile('^Sicherung begonnen')
end = re.compile('^Sicherung abgeschlossen')
directory = re.compile('^Verzeichnisse:')
files = re.compile('^Dateien:')
time = re.compile('^Zeit:')
error = re.compile('^Der Vorgang wurde nicht')
jetzt will ich mit "print" mir z.B. time anzeigen lassen und sehen ob diese zeile rausgesucht worden ist. dies funzt natürlich nicht ohne weiteres, ich bekomme nur das
- <_sre.SRE_Pattern object at 0x00E4DD90>
ausgegeben. wie also kann ich es mir "blank" anzeigen lassen?
Verfasst: Mittwoch 4. Juli 2007, 14:44
von veers
Hinweis: Es gibt so etwas wie eine Edit Funktion...
Verfasst: Mittwoch 4. Juli 2007, 14:46
von vikingrussel
sie meinen? vielleicht etwas konkreter
Verfasst: Mittwoch 4. Juli 2007, 15:02
von veers
vikingrussel hat geschrieben:sie meinen? vielleicht etwas konkreter
Neben dem Zitat Knopf gibt es einen Edit Knopf. Mit dem kannst du bestehende Posts bearbeiten/erweitern. Dann ist es nicht nötig immer neue zu schreiben.
Verfasst: Mittwoch 4. Juli 2007, 15:24
von BlackJack
@vikingrussel: Lies doch einfach mal die Doku zum `re`-Modul.
Ansonsten ist `re` für die gezeigten Muster überdimensioniert. Bei der `match()`-Methode braucht man das '^' nicht extra angeben und dann sind's einfach nur normale Zeichenketten, deren Vorhandensein am Anfang einer Zeichenkette man auch mit `str.startswith()` überprüfen kann.
Verfasst: Donnerstag 5. Juli 2007, 07:22
von vikingrussel
das war also mit edit gemeint, ja ok
@BlackJack: es ist nicht überdimensioniert, es kommt noch was dazu wo ich "re" brauch. das ist aber auch nicht mein problem. das problem ist das "medium in dem fall
nur ein zeiger auf einen speicherbereich ist und ich es somit nicht ohne weiteres in eine andere datei schreiben kann. und ich weiß nicht wie ich daraus einen string (sprich die komplette rausgefilterte zeile) zum schreiben machen soll.
ansonsten danke erstmal für die antworten
Verfasst: Donnerstag 5. Juli 2007, 10:24
von BlackJack
In Python hat man keine Zeiger in Speicherbereiche sondern Namen die an Objekte gebunden sind. `medium` ist hier an ein Objekt gebunden, das einen übersetzten regulären Ausdruck darstellt. Wenn man damit in einer Zeichenkette sucht (`search()`-Methode) oder einen Anfang einer Zeichenkette überprüft (`match()`-Methode), bekommt man `None` oder ein Match-Objekt zurück. Was man mit diesen Objekten anstellen kann, d.h. welche Attribute und Methoden sie haben, steht in der Dokumentation.
Verfasst: Donnerstag 5. Juli 2007, 12:56
von vikingrussel
teil des scripts welcher erstmal laufen soll:
Code: Alles auswählen
# -*- coding: cp1252 -*-
from xml.dom.minidom import parseString
from xml.etree.ElementTree import Element, SubElement, tostring, dump
import re
import sys
import codecs
#import string
# Öffnen von Log-Datei(en)
logfile = codecs.open('C:\Dokumente und Einstellungen\\maruscma\\Desktop\\backup-log\\backup01.log', 'r', 'utf-16')
#Suchmuster
medium = re.compile('^Mediumname:')
drive = re.compile('^Sicherung von')
art = re.compile('^Sicherungsart:')
begin = re.compile('^Sicherung begonnen')
end = re.compile('^Sicherung abgeschlossen')
directory = re.compile('^Verzeichnisse:')
files = re.compile('^Dateien:')
time = re.compile('^Zeit:')
error = re.compile('^Der Vorgang wurde nicht')
for z in logfile.readlines():
print z
#medium = "Medium"
#drive = "Sicherung"
# XML-Baum erzeugen
root = Element('events')
event_node = SubElement (root, 'event')
SubElement (event_node, 'Mediumname').text = medium
SubElement (event_node, 'Sicherung von').text = drive
#SubElement (event_node, 'Sicherungsart:').text = art
#SubElement (event_node, 'Sicherung begonnen').text = begin
print tostring(root)
am ende soll die struktur der xml ausgegeben werden, wird aber nicht.
folgender fehler:
Traceback (most recent call last):
File "C:\Python25\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 307, in RunScript
debugger.run(codeObject, __main__.__dict__, start_stepping=0)
File "C:\Python25\Lib\site-packages\pythonwin\pywin\debugger\__init__.py", line 60, in run
_GetCurrentDebugger().run(cmd, globals,locals, start_stepping)
File "C:\Python25\Lib\site-packages\pythonwin\pywin\debugger\debugger.py", line 631, in run
exec cmd in globals, locals
File "C:\Dokumente und Einstellungen\maruscma\Desktop\test_xml.py", line 36, in <module>
print tostring(root)
File "C:\Python25\lib\xml\etree\ElementTree.py", line 1009, in tostring
ElementTree(element).write(file, encoding)
File "C:\Python25\lib\xml\etree\ElementTree.py", line 663, in write
self._write(file, self._root, encoding, {})
File "C:\Python25\lib\xml\etree\ElementTree.py", line 707, in _write
self._write(file, n, encoding, namespaces)
File "C:\Python25\lib\xml\etree\ElementTree.py", line 707, in _write
self._write(file, n, encoding, namespaces)
File "C:\Python25\lib\xml\etree\ElementTree.py", line 705, in _write
file.write(_escape_cdata(node.text, encoding))
File "C:\Python25\lib\xml\etree\ElementTree.py", line 813, in _escape_cdata
_raise_serialization_error(text)
File "C:\Python25\lib\xml\etree\ElementTree.py", line 777, in _raise_serialization_error
"cannot serialize %r (type %s)" % (text, type(text).__name__)
TypeError: cannot serialize <_sre.SRE_Pattern object at 0x00DF0158> (type SRE_Pattern)
ideen?
Verfasst: Donnerstag 5. Juli 2007, 13:17
von BlackJack
Ja, lies verdammt nochmal endlich die `re`-Dokumentation, die Beiträge hier und vielleicht auch das Python-Tutorial.
`medium` ist an ein Objekt gebunden, das einen kompilierten regulären Ausdruck darstellt. Das habe ich aber schonmal geschrieben.
Verfasst: Donnerstag 5. Juli 2007, 13:29
von vikingrussel
das mit dem objekt is mir klar, tschuldigung das ich das falsch ausgedrückt hab. deswegen geht das ganze vorerst auch nicht. bis hier is mir das soweit alles klar.
in der doku von "re" steht davon nichts, wie ich daraus einen "text" machen soll, oder ich hab es net gesehen
Verfasst: Donnerstag 5. Juli 2007, 13:43
von EnTeQuAk
Du wirst keine Hilfe bekommen können, wenn du nicht selber etwas agierst.
Die Variable 'medium' ist an ein (wie dein Kommentar darüber gut sagt) Suchmuster gebunden. Ein Muster, welches von Funktionen des Moduls 're' verstanden wird und zum durchsuchen von Text und herausfinden von entsprechenden Stellen benutzt wird.
Was möchtest du denn eigentlich machen? Das sieht nach ziemlichen Gewusel aus, was du da veranstaltest.
Was soll in deiner XML Datei später stehen?
Achso, und da ich ein ganz lieber Mensch bin (behaupten zumindest meine Kollege auf Arbeit), bekommste auch noch den Link zur Dokumentation, die bereits zwei mal von BlackJack angesprochen wurde:
http://www.python.org/doc/2.4.4/lib/module-re.html
Und um mal ganz blööd zu fragen:
in der doku von "re" steht davon nichts, wie ich daraus einen "text" machen soll, oder ich hab es net gesehen
Woraus möchtest du einen Text machen? Aus den Suchmustern? Wozu? Weshalb? Warum?
MFG EnTeQuAk
Verfasst: Donnerstag 5. Juli 2007, 13:58
von vikingrussel
tut mir leid wenn ich es nicht hinkrieg mich so auszudrücken, wie es soll.
doku von `re`hab ich mittlerweile etliche male durchgelesen und nichts gefunden was mich weiterbringt (so schlecht ist mein englisch nicht, auch wenn ich das nicht ausschliessen will).
die xml soll grob gesehen so aussehen:
Code: Alles auswählen
<events>
<event>
<Mediumname>Medium</Mediumname>
</event>
</events>
nur das anstatt von "Medium" das stehen soll, was ich mit dem suchmuster mir rausgeholt hab.
ich hoffe das ich jetzt verständlich genug war[/code]
Verfasst: Donnerstag 5. Juli 2007, 14:40
von EnTeQuAk
Dann hast du die Dokumentation nicht richtig gelesen
Code: Alles auswählen
SubElement (event_node, 'Mediumname').text = medium.match(logfile.read()).group()
Ohne gewähr, sollte aber gehen, wenn ich mich jetzt nicht verschaut habe
MFG EnTeQuAk
Verfasst: Donnerstag 5. Juli 2007, 14:50
von vikingrussel
mein englisch ist doch zu scheisse, aber egal. jetzt ergibt einiges gelesenes einen ganz neuen sinn, der auch wirklich einleuchtend ist, bis auf eines (nur zum verständnis); warum eigentlich dann noch `group()`?
ansonsten danke (an alle)
Verfasst: Donnerstag 5. Juli 2007, 14:54
von vikingrussel
hat sich erledigt, aufgrund deines geschriebenen und nochmaliges lesen der doku (zum hundertsten mal wahrscheinlich) hat sich das jetzt alles für mich erschlossen und nochmal danke