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

Mittwoch 4. Juli 2007, 13:28

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:

Mittwoch 4. Juli 2007, 13:42

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

Mittwoch 4. Juli 2007, 13:43

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

Mittwoch 4. Juli 2007, 13:43

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

Mittwoch 4. Juli 2007, 13:44

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

Mittwoch 4. Juli 2007, 14:35

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:

Mittwoch 4. Juli 2007, 14:44

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

Mittwoch 4. Juli 2007, 14:46

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

Mittwoch 4. Juli 2007, 15:02

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

Mittwoch 4. Juli 2007, 15:24

@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

Donnerstag 5. Juli 2007, 07:22

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

Donnerstag 5. Juli 2007, 10:24

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

Donnerstag 5. Juli 2007, 12:56

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

Donnerstag 5. Juli 2007, 13:17

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

Donnerstag 5. Juli 2007, 13:29

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
Antworten