ubuntuusers.de

Textdatei unterteilen mit seperaor

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Serengeti

Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1964

Ich habe 6 Text Dateien (1.txt, 2.txt, 3.txt, etc), die ich gerne jeweils wiederum aufspalten möchte. An diversen stellen wird die Textdatei durch eine Folge von ca.10 Unterstriche in Kapitel unterteilt. Ich möchte nun gerne die Dateien in jeweils zwei Kapitel umfasende Text Datei (2.01.txt, 2.02.txt, etc) aufspalten.

Kann mir wer sagen wie ich das am schnellsten auf Kommandozeilenebene bewerkstellige?

THX

Serengeti

martinAC

Anmeldungsdatum:
8. Januar 2010

Beiträge: Zähle...

Falls es ein kleines Python-Programm sein darf:

 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
#!/usr/bin/env python

def getOutName(i, j):
    extraStr = ""
    if j < 10:
        return str(i+1) + ".0" + str(subI) + ".txt"
    else:
        return str(i+1) + "." + str(subI) + ".txt"
     
for i in range(6):	# fuer 6 Dateien im aktuellen Verzeichnis
    filename = str(i+1) + ".txt"
    fobj = open(filename, 'r') # Datei oeffnen

    subI = 1 # Zaehler fuer Unterkapitel
    filenameOut = getOutName(i, subI)
    fout = open(filenameOut, 'w')
    for line in fobj:
	print line
        if not line.strip().startswith("________"):   # keine 8 Unterstriche
            fout.write(line)    # in neue Datei schreiben
        else:   # Wechsel des Unterkapitels
            fout.close()    # Datei fertig
            subI = subI + 1
            filenameOut = getOutName(i, subI)
            fout = open(filenameOut, 'w')   # naechste Datei erstellen
            
    fout.close()
    fobj.close()

Erläuterungen: Sicherheitshalber vorher eine Kopie der Textdateien machen 😉 Den Code einfach in eine Textdatei mit Endung .py einfügen, z.B. "kapitelTool.py", und in das Verzeichnis mit den Kapiteln kopieren. Dann in der Shell in den Ordner wechseln und mit "python kapitelTool.py" aufrufen.

Gruß

Martin

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

@martinAC: Das mag funktionieren, sieht aber nicht nach idiomatischem Python aus. Eher nach BASIC.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

@martinAC: Oje, Python solltest Du aber dringend noch etwas üben:

 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
35
36
#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import sys
from itertools import count


def write_chapter(filename, chapter, no):
    name, ext = os.path.splitext(filename)
    with open('{0}.{1:02}{3}'.format(name, no, ext), 'w') as stream:
        stream.writelines(chapter)


def split_file(filename):
    chapter_no = count(1)
    chapter = []
    with open(filename) as stream:
        for line in stream:
            if line.strip.startswith('________'):
                write_chapter(filename, chapter, next(chapter_no))
                chapter = []
            else:
                chapter.append(line)


def main():
    filenames = sys.argv[1:]
    if not filenames:
        sys.exit('Please specify filenames')
    for filename in files:
        split_file(filename)


if __name__ == '__main__':
    main()

Serengeti

(Themenstarter)
Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1964

Danke dir martinAC für deine mühe

und auch dir Lunar für deine Korrektur

Leider Jedoch muss ich sagen, dass das script von martinAC Tadellos genau so funktioniert hat wie er es beschrieben hat wogegen das script von Lunar welches ich zuerst probiert habe, nicht funktioniert hat. Da ich keinerlei Python Kenntnisse besitze konnte ich nicht ermitteln wo der fehler lag. bzw. wie ich die ausgabe "Please specify filenames" in die tat umsetzen musste.

Serengeti

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Serengeti schrieb:

Leider Jedoch muss ich sagen, dass das script von martinAC Tadellos genau so funktioniert hat wie er es beschrieben hat wogegen das script von Lunar welches ich zuerst probiert habe, nicht funktioniert hat. Da ich keinerlei Python Kenntnisse besitze konnte ich nicht ermitteln wo der fehler lag. bzw. wie ich die ausgabe "Please specify filenames" in die tat umsetzen musste.

Bei Lunars Script müssen die Dateien als Kommandozeilenargumente übergeben werden, z. B. python kapitelTool.py {1..6}.txt

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Man verzeihe mir meine Nachlässigkeit, aber ich hatte nicht gedacht, dass so grundsätzliche Fragen zu klären sind.

Serengeti

(Themenstarter)
Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1964

1.txt und t.py liegen im selben verzeichnis

python t.py 1.txt

dann erhalte ich folgende Meldung

  Traceback (most recent call last):
   File "t.py", line 36, in <module>
     main()
   File "t.py", line 31, in main
     for filename in files:
NameError: global name 'files' is not defined

Serengeti

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Ändere einfach Zeile 31 in folgende um:

1
    for filename in filenames:

Serengeti

(Themenstarter)
Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1964

  File "t.py", line 36, in <module>
    main()
  File "t.py", line 32, in main
    split_file(filename)
  File "t.py", line 20, in split_file
    if line.strip.startswith('________'):
AttributeError: 'builtin_function_or_method' object has no attribute 'startswith'

nun Ja lassen wir das

Das Script von martinAC hatte ja wunderbar funktioniert und die FanFiction besteht jetzt aus handlichen teilen.

Serengeti

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Serengeti schrieb:

  File "t.py", line 36, in <module>
    main()
  File "t.py", line 32, in main
    split_file(filename)
  File "t.py", line 20, in split_file
    if line.strip.startswith('________'):
AttributeError: 'builtin_function_or_method' object has no attribute 'startswith'

nun Ja lassen wir das

Wieso? Ich denke das sollte es beheben:

1
            if line.strip().startswith('________'):

Das Script von martinAC hatte ja wunderbar funktioniert und die FanFiction besteht jetzt aus handlichen teilen.

Ist ja richtig - für Dich macht es sicherlich kaum einen Unterschied. Aber das Script als solches ist eben wenig pythonic. Da Du keinen Text gepostet hattest, hat Lunar es wohl nicht testen können. Ansonsten wären ihm diese Kleinigkeiten sofort aufgefallen.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

@Lysander: Danke, dass Du meine Nachlässigkeit verteidigst ☺ Dennoch muss ich mich für die Unannehmlichkeiten entschuldigen. 😳

Serengeti

(Themenstarter)
Avatar von Serengeti

Anmeldungsdatum:
24. Februar 2008

Beiträge: 1964

Lysander schrieb:

Ist ja richtig - für Dich macht es sicherlich kaum einen Unterschied. Aber das Script als solches ist eben wenig pythonic. Da Du keinen Text gepostet hattest, hat Lunar es wohl nicht testen können. Ansonsten wären ihm diese Kleinigkeiten sofort aufgefallen.

Bitte sehr. hier findet sich in jedem Kapitel mehr als genügend Material zum testen. ☺

Serengeti

Antworten |