Python Programm um die ersten 14 Zeilen einer ACII zu eliminieren

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
lukas314
User
Beiträge: 3
Registriert: Freitag 31. August 2018, 13:31

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
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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

Code: Alles auswählen

def loot(fname, new_fname):
    # code
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.

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
lukas314
User
Beiträge: 3
Registriert: Freitag 31. August 2018, 13:31

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 :oops:
lukas314
User
Beiträge: 3
Registriert: Freitag 31. August 2018, 13:31

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
Sirius3
User
Beiträge: 18267
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Antworten