Seite 1 von 1
Python Programm um die ersten 14 Zeilen einer ACII zu eliminieren
Verfasst: Freitag 31. August 2018, 13:43
von lukas314
Hallo Python Community,
Ich versuche gerade 100 Files mit Daten so zu ändern dass ich nur noch den Output von Zeile 15-710 bekomme. Ich hab noch nicht sonderlich viel in Python porgrammiert und bin über jede Hilfe dankbar. Die files sind nummeriert mit (10,20,30,40,...,1000) und '.txt'-files Der Code sieht folgendermaßen aus:
__________________________
from contextlib import nested
e=10
while True:
def loot('fname' + str(e) + '.txt', 'newfname' + str(e) + '.txt'):
with nested(open('fname' + str(e) + '.txt'), open('newfname' + str(e) + '.txt', 'w')) as (in_, out):
for i, line in enumerate(in_):
if 15 <= i <=711:
out.write(line)
if i > 711:
break
e += 10
if e >= 1010:
break
__________________________
Bekomme leider immer wieder die Fehlermeldung 'Expected an indented block' in der Zeile
def loot('fname' + str(e) + '.txt', 'newfname' + str(e) + '.txt'):
Vielen Dank für jedmögliche Hilfe,
VG
Re: Python Programm um die ersten 14 Zeilen einer ACII zu eliminieren
Verfasst: Freitag 31. August 2018, 14:20
von /me
Aktuell hast du ein while ohne Schleifeninhalt, da der Rest darunter nicht eingerückt ist. Die Einrückung ist ohnehin im Forum nicht zu lesen. Bitte formatiere den Code hier auch mit den entsprechenden Code-Tags.
Anschließend wirst du dann auf einen Fehler in der anschließenden unkorrekten Funktionsdeklaration laufen. Was glaubst du was "def loot('fname' + str(e) + '.txt', 'newfname' + str(e) + '.txt'):" tut? Abgesehen davon ist es ohnehin nicht sinnvoll, eine Funktion innerhalb einer Schleife immer wieder zu definieren.
Re: Python Programm um die ersten 14 Zeilen einer ACII zu eliminieren
Verfasst: Freitag 31. August 2018, 14:24
von ThomasL
Was soll denn diese Zeile
Code: Alles auswählen
def loot('fname' + str(e) + '.txt', 'newfname' + str(e) + '.txt'):
bewirken?
def läutet die Definition einer Funktion oder Klasse ein.
zB
Die Funktion rufst du dann mit Argumenten auf,
zB
Code: Alles auswählen
loot('fname' + str(e) + '.txt', 'newfname' + str(e) + '.txt')
Dieses zusammen basteln von Strings per + ist nicht pythonic.
Dafür gibt es ab Python 3.6 z.B. die f-Strings.
Re: Python Programm um die ersten 14 Zeilen einer ACII zu eliminieren
Verfasst: Freitag 31. August 2018, 14:54
von lukas314
Danke für eure Antworten! Also aktuell hab ich eine einfachere Möglichkeit gefunden den gewünschten Output zu bekommen. Das Zusammenbasteln von Strings auf diese Art und Weise hat bei mir bisher funktioniert.
Also für ein Textfile, dass mir den Output von Zeile 15-850 gibt kann ich folgenden Code verwenden:
Code: Alles auswählen
readFile = open("fname10.txt")
lines = readFile.readlines()
readFile.close()
w = open("fname10.txt",'w')
w.writelines([item for item in lines[15:850]])
w.close()
Allerdings möchte ich nun eine Schleife integrieren die mir das eben für 100 Textdateien macht. Also etwas in der Art
Code: Alles auswählen
e = 10
while True:
readFile = open("fname{str(e)}.txt")
lines = readFile.readlines()
readFile.close()
w = open("fname{str(e)}.txt",'w')
w.writelines([item for item in lines[15:850]])
w.close()
e += 10
if e >= 1010:
break
PS: Ich weiß dass der Code nicht zulässig ist!
Verwende python 2.7.12 und entschuldige mich jetzt schon für meine primitiven Programmierkünste

Re: Python Programm um die ersten 14 Zeilen einer ACII zu eliminieren
Verfasst: Freitag 31. August 2018, 16:23
von lukas314
Also Problem ist nun gelöst. Falls es für jemand anderen auch noch interessant ist:
Code: Alles auswählen
e = 10
while True:
readFile = open('fname'+str(e)+'.txt')
lines = readFile.readlines()
readFile.close()
w = open('fname'+str(e)+'.txt','w')
w.writelines([item for item in lines[14:1500]])
w.close()
e += 10
if e >= 1010:
break
Dadurch liest er mir alle files mit Nummerierung "fname10", "fname20","fname30",...,"fname1000" ein und eliminiert alle Zeilen bis auf die Zeilen 14-1500.
TOPIC CLOSED
Re: Python Programm um die ersten 14 Zeilen einer ACII zu eliminieren
Verfasst: Freitag 31. August 2018, 20:12
von Sirius3
Wenn Du schon vorher weißt, wie oft eine Schleife durchlaufen werden soll, dann nimm eine for-Schleife. Die Listcomprehension bei writelines ist überflüssig, weil die Liste ja schon iterierbar ist. Nimm das with-Statement um Dateien zu öffnen.
Code: Alles auswählen
from itertools Import islice
for number in range(10, 1010, 10):
with open('fname{}.txt'.format(number)) as lines:
lines = list(islice(lines, 14, 1500))
with open('fname{}.txt'.format(number)) as output:
output.writeline(lines)