Anfänger braucht Hilfe (Sortierung einer txt datei)

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.
Antworten
WillisMcGahee
User
Beiträge: 6
Registriert: Mittwoch 20. September 2006, 14:37

Servus,
ich muss im moment für die Arbeit ein python skript schreiben, obwohl das weder mein eigentliches aufgaben gebiet ist noch ich schon sonderlich erfahren im umgang mit python bin..
ich hab den angepinnten thread gelesen, dass das forum nicht dafür da ist, dass anderer seine eigenen aufgaben machen, versteh das auch, bitte aber trotzdem um hilfe, aber auch nur um den ein oder anderen denkanstoß, nicht gleich um ein fertiges skript.

ich will jetzt (vorerst :-D) auch keine hilfe beim kompletten skript, sondern nur folgendes:

ich habe eine txt datei, dort suche ich nach einer zeile und möchte dann diese bestimmte zeile UND die zeile davor und die danach aus der vorhandenen txt ausschneiden und in eine neue txt datei, die als namen, den inhalt der zuvor gesuchten zeile hat, einfügen.

aus einer txt mit dem namen "test" und dem inhalt:

bla
blubb
bli
blu
zeile
blä
ble
blaur

sollte das skript also 2 txt dateien machen, nämlich zum einen "test":
bla
blubb
bli



ble
blaur

und zum anderen "zeile":

blu
zeile
blä



das suchen der richtigen zeile ist soweit kein problem, mein problem besteht darin, dass ich nicht weiß wie ich die zeilen davor und danach mit ausschneide und wie ich die neue txt datei nach dem inhalt der zeile benenne. Da das ganze mehrmals, also in einer schleife abläuft kann ich die neue txt datei ja nicht manuell benennen, sondern sie muss nach dem jeweiligen zeileninhalt benannt werden.

wie gesagt: bin ziemlicher anfänger was programmiersprachen angeht und bitte meine etwas "amateurhafte" schreibweise zu entschuldigen :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

WillisMcGahee hat geschrieben:ich hab den angepinnten thread gelesen, dass das forum nicht dafür da ist, dass anderer seine eigenen aufgaben machen, versteh das auch, bitte aber trotzdem um hilfe, aber auch nur um den ein oder anderen denkanstoß, nicht gleich um ein fertiges skript.
Wunderbar. Dann geb ich dir den möglichen Ablauf an (das mit Indizes addieren kannst du auch anders lösen, wenn du magst):
  1. Du öffnest die Datei
  2. Du liest die Zeilen mit dateiobj.readlines() in eine Liste ein
  3. Du bestimmtst in dieser Liste den Index der Zeile den du suchst.
  4. Nun ziehst du vom Index eins ab um die Zeile davor zu bekommen, die du in die neue Datei schriebst
  5. Du addierst zum Index eins dazu, damit bekommst du deine gewünschte Zeile
  6. Du addierst noch eines dazu, dann bekommst du die Zeile nach deriner gewünschten Zeile. Auch diese Schreibst du wieder in deine neue Datei
  7. Fertig, das war doch schön einfach, oder? :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
bb1898
User
Beiträge: 199
Registriert: Mittwoch 12. Juli 2006, 14:28

Leonidas hat geschrieben: Wunderbar. Dann geb ich dir den möglichen Ablauf an (das mit Indizes addieren kannst du auch anders lösen, wenn du magst):
  1. Du öffnest die Datei
  2. Du liest die Zeilen mit dateiobj.readlines() in eine Liste ein
  3. Du bestimmtst in dieser Liste den Index der Zeile den du suchst.
  4. Nun ziehst du vom Index eins ab um die Zeile davor zu bekommen, die du in die neue Datei schriebst
  5. Du addierst zum Index eins dazu, damit bekommst du deine gewünschte Zeile
  6. Du addierst noch eines dazu, dann bekommst du die Zeile nach deriner gewünschten Zeile. Auch diese Schreibst du wieder in deine neue Datei
  7. Fertig, das war doch schön einfach, oder? :)
Und Punkt 3 ergänzt Du noch: Du nimmst den Inhalt dieser Zeile als Dateinamen für Deine neue Datei. Wenn die Zeilen, anders als in Deinem Beispiel, auch aus mehreren Worten bestehen können, musst Du Dir dazu vielleicht noch ein bisschen mehr überlegen (Windows schluckt Dateien mit Leerzeichen im Namen zwar anstandslos, aber deshalb ist es noch kein wirklich guter Einfall).
WillisMcGahee
User
Beiträge: 6
Registriert: Mittwoch 20. September 2006, 14:37

ok super danke :)
dieses dateiobj.readlines() kannte ich nicht (gibts irgendwo ne übersicht für alles was man so braucht um texte zu editieren, dateien zu ordnen etc? )

nur mein 2.problem hab ich immer noch: wie kann ich die neue txt datei automatisch nachdem inhalt der gesuchten zeile benennen lassen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

WillisMcGahee hat geschrieben:ok super danke :)
dieses dateiobj.readlines() kannte ich nicht (gibts irgendwo ne übersicht für alles was man so braucht um texte zu editieren, dateien zu ordnen etc? )
Kapitel 7 des Python-Tutorials zum Beispiel. docs.python.org enthält meiner Meinung nach sehr gute, lesenswerte Dokumentation.
WillisMcGahee hat geschrieben:nur mein 2.problem hab ich immer noch: wie kann ich die neue txt datei automatisch nachdem inhalt der gesuchten zeile benennen lassen?
bb1898 hat das bereits beantwortet. Tut mir leid, den Teil habe ich einfach übersehen :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
WillisMcGahee
User
Beiträge: 6
Registriert: Mittwoch 20. September 2006, 14:37

So mit eurer Hilfe hab ich das jetzt einigermaßen hingebracht :D

nächster punkt:
ich will jetzt alle dateien, die ich zuvor erstellt hab in ne andere txt datei hineinkopieren (der umweg über die einzelnen dateien ist leider notwendig)
gibt es eine möglichkeit alle txt dateien in einem ordner einzulesen und in eine andere txt datei zu kopieren?
oder gibt es eine möglichkeit zumindest alle dateinamen eines ordners in eine liste einzulesen, damit man daraus dann die dateinamen herausziehen kann um alle txt dateien zu öffnen?

schonmal vielen dank im vorraus :)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Schau Dir mal walk() im Modul os an.
Das Betriebssystem sollte dies aber auch erledigen können, z.B. in Windows alle Textdateien in output.txt kopieren:
copy *.txt output.txt
Übrigens, so habe ich Dein erstes Problem gelöst (hoffentlich):

Code: Alles auswählen

f = file('test.txt', 'r')
inhalt = f.readlines()
f.close()
text = 'zeile\n'
if text in inhalt:
    f = file('%s.txt' % text.strip(), 'w')
    i = inhalt.index(text)
    if i > 0:
        f.write(inhalt[i - 1])
        inhalt[i - 1] = '\n'
    f.write(inhalt[i])
    inhalt[i] = '\n'
    if i < len(inhalt) - 1:
        f.write(inhalt[i + 1])
        inhalt[i + 1] = '\n'
    f.close()
f = file('test.txt', 'w')
for zeile in inhalt:
    f.write(zeile)
f.close()
MfG
HWK
WillisMcGahee
User
Beiträge: 6
Registriert: Mittwoch 20. September 2006, 14:37

servus, ich bins wieder mal
hätt noch ne frage:

ich hab 2 textdateien und will von der ersten alles ab einer bestimmten stelle in die andere kopieren. das kopieren ist soweit kein problem, weil ich es nur anhängen muss und nicht in eine bestimmte stelle hineinkopieren muss.
nur wie sag ich ihm, dass er erst ab einer bestimmten stelle in der ersten datei kopieren soll?
BlackJack

Du könntest eine Funktion schreiben die alles bis zu einer Zeile die eine bestimmte Bedingung erfüllt, "verschluckt" (ungetestet):

Code: Alles auswählen

def ignore_until(lines, condition):
    for line in lines:
        if condition(line):
            break
    yield line  # Nur wenn diese Zeile auch erscheinen soll.
    for line in lines:
        yield line


def test():
    in_file = open('bla.txt', 'r')
    out_file = open('blub.txt', 'a')
    for line in ignore_until(in_file, lambda line: line.startswith('---8<---')):
        out_file.write(line)
    in_file.close()
    out_file.close()
WillisMcGahee
User
Beiträge: 6
Registriert: Mittwoch 20. September 2006, 14:37

hm danke...habs so gemacht:

Code: Alles auswählen

input = file('C:\bla.xml', 'r')
output = file('C:\blubb.xml', 'a')
Text = input.readlines()

toggle = False
for Zeile in Text:	
	if Zeile.startswith('beispiel'):
		toggle = True
	while (toggle == True):
		output.write(Zeile)
		break
funktioniert wunderbar :-)


so jetzt muss ich nur noch das oben angesprochene problem mit den verschiedenen txts lösen und dann heißts für mich dank euch erstmal mehr kein python für ne (hoffentlich!?) lange zeit :D
BlackJack

WillisMcGahee hat geschrieben:hm danke...habs so gemacht:

Code: Alles auswählen

input = file('C:\bla.xml', 'r')
output = file('C:\blubb.xml', 'a')
Text = input.readlines()

toggle = False
for Zeile in Text:	
	if Zeile.startswith('beispiel'):
		toggle = True
	while (toggle == True):
		output.write(Zeile)
		break
funktioniert wunderbar :-)
Mag funktionieren aber die ``while``-"Schleife" ist grausam. Die wird durch das ``break`` maximal einmal ausgeführt. Bitte ersetze sie durch ein einfaches ``if toggle:`` und ohne ``break``.
so jetzt muss ich nur noch das oben angesprochene problem mit den verschiedenen txts lösen und dann heißts für mich dank euch erstmal mehr kein python für ne (hoffentlich!?) lange zeit :D
<marktschreier>Steine und Bärte zu verkaufen...</marktschreier> ;-)
BlackJack

Mir sind gerade die Dateinamen aufgefallen: Etwas an eine XML-Datei anhängen ist zumindest fragwürdig. Wenn da am Anfang nicht mal ein "Vorspann" und am Ende das "Wurzel-End-Tag" geschrieben wird, dann bekommt man so jedenfalls kein wohlgeformtes XML hin.

Und wenn man XML zeilenweise verarbeitet, wie eine normale Textdatei, sollte man sich auch sicher sein, bzw. bewusst machen, dass das nur funktioniert solange die Dateien so schön zeilenweise formatiert sind.
WillisMcGahee
User
Beiträge: 6
Registriert: Mittwoch 20. September 2006, 14:37

BlackJack hat geschrieben:Mir sind gerade die Dateinamen aufgefallen: Etwas an eine XML-Datei anhängen ist zumindest fragwürdig. Wenn da am Anfang nicht mal ein "Vorspann" und am Ende das "Wurzel-End-Tag" geschrieben wird, dann bekommt man so jedenfalls kein wohlgeformtes XML hin.

Und wenn man XML zeilenweise verarbeitet, wie eine normale Textdatei, sollte man sich auch sicher sein, bzw. bewusst machen, dass das nur funktioniert solange die Dateien so schön zeilenweise formatiert sind.
ja doch das passt schon..ich schneid nur ganze blöcke raus und füg nur ganze blöcke ein, und die xml is auch schön zeilenweise :)


hm meine schöne while schleife...vlt tu ich sie noch raus..ma schaun :D
Antworten