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
Ehemalige
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)
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)
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
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Ändere einfach Zeile 31 in folgende um:
| for filename in filenames:
|
|
Serengeti
(Themenstarter)
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
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:
| 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)
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
|