• 25.04.2024, 23:09
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Lieber Besucher, herzlich willkommen bei: Aqua Computer Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

powerslide

unregistriert

Python - Hilfe

Mittwoch, 8. Dezember 2004, 11:00

Morgen...

ich bastel momentan an oder mit python rum.
realisiert werden soll ein script, daß
eine datei nach gewissen strukturen durchsucht und diese dann ersetzt.

ganz konkret:
gesucht wird sowas:

Quellcode

1
<para class="heading1">text>/para>

da der text immer verschieden ist und auch mal ein heading3 vorkommt hab ich mir ne kleine regex gebaut die mir das passend sucht:

Quellcode

1
<para class="heading.">.*?</para>

funzt au ganz wunderbar
gesucht wird mit hilfe von re.search.
die datei wird einfach eingelesen und in ne variable "text" gespeichert.
so..
mir re.sub extrahier ich den eigentlichen text und danach wird das ganze wieder in der form wie ich mir das vorstelle zusammengebastelt

Quellcode

1
2
3
4
expr = re.sub ('<para class.*?', '', zu_ersetzen)
expr = re.sub ('</para>', '', expr)
code = "<p><b>%(expr)s</b></p>" % vars()        
text = re.sub (zu_ersetzen, code, text)


das ganze funktioniert auch einwandfrei..
leider sind meine eingelesenen dateien sehr gross.. >0,5MB raw_txt
und so bricht das ganze irgendwann einfach ab
suche ich nur nach z.b.

Quellcode

1
<para class="heading.">

funktionierts auch mit grossen dateien..

hat jemadn ne idee wie man das eleganter besser schneller und vorallem terminierender bekommt?

wär super

greetz
slid0r

Re: Python - Hilfe

Mittwoch, 8. Dezember 2004, 11:59

du benutzt aber nicht re.search() _und_ re.sub(), oder?


anstatt die datei erst komplett einzulesen, kannst du von iteratoren (seit 2.2 oder 2.3) gebrauch machen:

Quellcode

1
2
for line in open('datei.txt'):
    print line

am ende des scripts bzw. vorher von der garbage collection wird die datei automatisch geschlossen.

explizit, aber unnötig, sähe das so aus:

Quellcode

1
2
3
4
f = open('datei.txt')
for line in f:
    print line
f.close()


wenn die datei größer ist/sein könnte oder du nicht die originaldatei ändern willst (was im prinzip keine schlechte idee ist, falls mal was schief geht), wendest du re.sub() auf jede zeile an und schreibst das ergebnis in einen neuen file-deskriptor.

ich sehe nicht ganz, was du genau vorhast. aber davon ausgehend, dass du <para ...> in <p><b> und </para> in </b></p> ersetzen willst, würde das ganze in etwa so aussehen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python

import re

infile = 'datei1.txt'
outfile = 'datei1a.txt'

out = open(outfile, 'w')
for line in open(infile):
    tmp1 = re.sub('<para class=".+">', '<p><b>', line)
    tmp2 = re.sub('</para>', '</b></p>', line)
    out.write(line)
out.close()

so musst du nicht auf die matches zugreifen.

falls du aber was anderes vorhast, lass hören.

powerslide

unregistriert

Re: Python - Hilfe

Mittwoch, 8. Dezember 2004, 12:33

also was ich genau vor habe:

ich bekomm per xml-export ein paar nette dateien..
leider sind einige tags nicht html konform

<para> </para> für nen absatz
<para class="heading."> </para> für ne überschrift
und [[ ]] für komische links

und mein chief hat halt gemeint wenn ich ma was anderes machen will soll ich doch ma versuchen ob ich das nich mit python oder so html konform hinbekomme.. indem ich eben genannte strings suche und entsprechend ersetze..

und da ich selber noch nicht viel kann.. arbeite ich mich momentan durch tutorials und versuch mir was zusammenzubasteln so dass es das macht was ich will *hehe*

klappt nur leider nicht immer..

dein filefinder funzt aber ganz hervorragend ;D

slid0r


ach ja .. ich wollte eigentlich die ordnerstruktur wo sich die datein drin verstecken sagen wir mal x:\todo\project1\
nach x:\todo\project1done\ kopieren und da dann entsprechend die veränderten files wieder reinbauen.. hat.. naja nur halb geklappt.. das ding wollt mir einfach keine ordner anlegen :P :-X

powerslide

unregistriert

Re: Python - Hilfe

Mittwoch, 8. Dezember 2004, 13:04

so.. hab mir grad deine lösung da mal angeschaut..

das problem dabei .. ich hab noch andere para anweisungen.. allerdings sollen die einfach zu nem normalen absatz umgebastelt werden.. nur die mit dem heading zu absatz+bould und natürlich müssen nach der überschrift die tags wieder geschlossen werden..

is ne ziemliche fummelei.. auch in der hinsicht in welcher reihenfolge die filter angewendet werden

richtig freuen tu ich mir nur noch auf die extremst verschachtelten [[ und [[[ und ([[ ausdrücke *hass*

Re: Python - Hilfe

Mittwoch, 8. Dezember 2004, 13:37

dann versuch mal diese:

Quellcode

1
2
re.sub('<para>(.+?)</para>', r'<p>\1</p>', line)
re.sub('<para class="heading(\d)">(.+?)</para>', r'<h\1>\2</h\1>', line)

wobei \1 und \2 für den ersten und zweiten match stehen. evtl. musste da ne exception fangen.


edit: wenn da nicht die eckigen klammern wären, wäre _im endeffekt_ ein xml-handler fast die bessere lösung. aber das macht nicht so viel spaß wie regex ;)

powerslide

unregistriert

Re: Python - Hilfe

Mittwoch, 8. Dezember 2004, 13:57

so..

uffza.. .. ich bau jezz ersma mein ganzes konstrukt um ;D

und versuch deinen code mal mit reinzuknüpfeln ...

i meld mich dann

sow..

ich hab nu das draus gebastelt

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# -*- coding: iso-8859-15 -*-
#!/usr/bin/env python

def convert():

    import os
    import string
    import re
    
    pfad = input("Suchpfad > ")
    
    def filter1(infile, outfile):
        out = open(outfile, 'w')
        for line in open(infile):
            re.sub('<para>(.+?)</para>', r'<p>\1</p>', line)
            re.sub('<para class="heading.(\d)">(.+?)</para>', r'<p><b>\2</b></p>', line)
            out.write(line)
        out.close()

    def findfiles(path, extension, depth=0):
        for item in os.listdir(path):
            itemWithPath = os.path.join(path, item)
            if item.endswith(extension):
                print 'Datei '+ item +' wird eingelesen' # file name only
                datei = itemWithPath
                newdat = path + 'new_' + item
                print 'filter1 initialisiert'
                filter1(datei, newdat)
                print 'filter1 beendet
            if os.path.isdir(itemWithPath):
                findfiles(itemWithPath, extension, depth + 1)
        
    findfiles(pfad, '.xml')
    print 'Konvertierung abgeschlossen'


die einrückungen sind im editor korrekt..
er erstellt auch die neue datei.. aber neu == alt .. true

powerslide

unregistriert

Re: Python - Hilfe

Donnerstag, 9. Dezember 2004, 10:24

wuuaaahhhhhh

also mein filter schaut momentan so aus

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def filter1(infile, outfile):
    out = open(outfile, 'w')
    for line in open(infile):
        while 1:
            ort = re.search ('<para class="heading.">.*?</para>', line)
            if ort == None:
                break
            zu_ersetzen = ort.group()
            print zu_ersetzen
            expr = re.sub ('<para class.*?', '', zu_ersetzen)
            expr = re.sub ('</para>', '', expr)
            code = "<p><b>%(expr)s</b></p>" % vars()
            print code
            line = re.sub (zu_ersetzen, code, line)
            out.write(line)
    out.close()


also sollte das teil die datei eigentlich zeilenweise einlesen und auch wieder ausgeben..
macht er auch..
aber irgendwann bricht er einfach ab grml..

ich kopier ma den traceback:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in -toplevel-
    convert()
  File "H:\My Projects\python\filereader_v13.py", line 27, in convert
    findfiles(pfad, '.xml')
  File "H:\My Projects\python\filereader_v13.py", line 22, in findfiles
    filter1(datei, newdat)
  File "H:\My Projects\python\filter.py", line 44, in filter1
    line = re.sub (zu_ersetzen, code, line)
  File "C:\Python24\lib\sre.py", line 142, in sub
    return _compile(pattern, 0).sub(repl, string, count)
  File "C:\Python24\lib\sre.py", line 227, in _compile
    raise error, v # invalid expression
error: unbalanced parenthesis


mann.. und das am frühen morgen *grml*

ach ja.. die einrückungen sollten korrekt sein :)

Re: Python - Hilfe

Donnerstag, 9. Dezember 2004, 20:17

na vielleicht weil zu_ersetzen dem codeschnipsel nach ein ergebnistext ist, aber kein pattern.

powerslide

unregistriert

Re: Python - Hilfe

Freitag, 10. Dezember 2004, 10:56

komischerweise funzt es aber bei jedem anderen ausdruck den ich ersetzen will.. nur bei dem teil nicht *grml*

Re: Python - Hilfe

Freitag, 10. Dezember 2004, 23:44

überdenk nochmal genau die parameter in der drittletzten zeile. meinst du vielleicht expr statt zu_ersetzen? und da sind vermutlich auch gar keine REs mit gruppierungen drin, die er suchen und ersetzen würde, oder?

powerslide

unregistriert

Re: Python - Hilfe

Montag, 13. Dezember 2004, 16:05

hmm..

zur drittletzten zeile.. re.search liefert start und endpunkt des gesuchten ausdrucks zurück .. .group() liefert dann alles zurück was sich dazwischen befindet .. das speiuchere ich in zu ersetzen.. dann bastel ich mir meine neue expr .. und ersetz dies dann..

ich weiss sehr umständlich aber es geht..

das problem wieso es nicht ging lieg nicht an falscher syntax.. sondern daran dass in meinem text ne ) war .. und das liebe script somit eine regex vermutet hat wo gar keine war,.. daher auch die meldung mit der unbalanced paranthesis..

ich habs nun aber mit nem mix aus meinem halbwissen.. deinem code und code aussem python-forum geschafft.. es macht alles was ich will und is super schnell..

besten dank..

slid0r