problem mit zeichensatz

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.
vikingrussel
User
Beiträge: 40
Registriert: Mittwoch 30. Mai 2007, 07:45

habe eine datei zum lesen geöffnet, und lese wie folgt aus:

Code: Alles auswählen

for z in logfile.readlines():
    print z
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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
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.
vikingrussel
User
Beiträge: 40
Registriert: Mittwoch 30. Mai 2007, 07:45

mach ich, danke
vikingrussel
User
Beiträge: 40
Registriert: Mittwoch 30. Mai 2007, 07:45

keine ahnung welche kodierung der text
vikingrussel
User
Beiträge: 40
Registriert: Mittwoch 30. Mai 2007, 07:45

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?
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Hinweis: Es gibt so etwas wie eine Edit Funktion...
vikingrussel
User
Beiträge: 40
Registriert: Mittwoch 30. Mai 2007, 07:45

sie meinen? vielleicht etwas konkreter
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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.
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.
vikingrussel
User
Beiträge: 40
Registriert: Mittwoch 30. Mai 2007, 07:45

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

Code: Alles auswählen

medium = re.compile('^Mediumname:')
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
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.
vikingrussel
User
Beiträge: 40
Registriert: Mittwoch 30. Mai 2007, 07:45

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?
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.
vikingrussel
User
Beiträge: 40
Registriert: Mittwoch 30. Mai 2007, 07:45

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
vikingrussel
User
Beiträge: 40
Registriert: Mittwoch 30. Mai 2007, 07:45

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]
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
vikingrussel
User
Beiträge: 40
Registriert: Mittwoch 30. Mai 2007, 07:45

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)
vikingrussel
User
Beiträge: 40
Registriert: Mittwoch 30. Mai 2007, 07:45

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
Antworten