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
Python Programm um die ersten 14 Zeilen einer ACII zu eliminieren
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.
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.
Was soll denn diese Zeile
bewirken?
def läutet die Definition einer Funktion oder Klasse ein.
zB
Die Funktion rufst du dann mit Argumenten auf,
zB
Dieses zusammen basteln von Strings per + ist nicht pythonic.
Dafür gibt es ab Python 3.6 z.B. die f-Strings.
Code: Alles auswählen
def loot('fname' + str(e) + '.txt', 'newfname' + str(e) + '.txt'):
def läutet die Definition einer Funktion oder Klasse ein.
zB
Code: Alles auswählen
def loot(fname, new_fname):
# code
zB
Code: Alles auswählen
loot('fname' + str(e) + '.txt', 'newfname' + str(e) + '.txt')
Dafür gibt es ab Python 3.6 z.B. die f-Strings.
Code: Alles auswählen
loot(f'fname{str(e)}.txt', f'newfname{str(e)}.txt')
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
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:
Allerdings möchte ich nun eine Schleife integrieren die mir das eben für 100 Textdateien macht. Also etwas in der Art
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
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()
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
Verwende python 2.7.12 und entschuldige mich jetzt schon für meine primitiven Programmierkünste

Also Problem ist nun gelöst. Falls es für jemand anderen auch noch interessant ist:
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
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
TOPIC CLOSED
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)