Czytam plik dziennika, który ma kilka wierszy i zapisuję go do pliku tekstowego. wynik jest zapisywany w pliku jako jedna długa linia: ['\Bla Bla Bla\n Bla Bla Bla\n'] W oryginalnym pliku wygląda to dobrze linia po linii. Czytanie odbywa się w ten sposób:

text_file = open('my_file.log', 'rb')
lines = text_file.readlines()
    lines = lines[100:150] #line numbers range
    x = open(r"LocalLogFile.txt", "a")
    x.write(lines)

Jakieś pomysły, jak to rozwiązać, aby wyglądał jak oryginalny plik?

0
TheWiz 27 czerwiec 2021, 19:48

4 odpowiedzi

Najlepsza odpowiedź

Jest tu kilka problemów:

  1. Otwieranie pliku tekstowego w trybie binarnym
  2. Wczytanie całego pliku do pamięci
  3. Próba napisania listy do nowego pliku zamiast kilku pojedynczych linii.

Użyj itertools.islice, aby utworzyć nowy iterator, który pomija pierwsze 100 wierszy, a następnie zwraca następne 400 wierszy, po których możesz iterować za pomocą zwykłej pętli for, aby zapisać do pliku wyjściowego.

from itertools import islice


with open('my_file.log', 'r') as f:
    with open('LocalLogFile.txt', 'a') as x:
        for line in islice(f, 100, 150):
            print(line, file=x, end='')

Niektórzy mogą preferować pojedynczą instrukcję with:

with open('my_file.log', 'r') as f, open('LocalLogFile.txt', 'a') as x:
    for line in islice(f, 100, 150):
        print(line, file=x, end='')

Lub

with open('my_file.log', 'r') as f, \
     open('LocalLogFile.txt', 'a') as x:
    for line in islice(f, 100, 150):
        print(line, file=x, end='')

Python 3.10 umożliwi umieszczanie w nawiasach wielu menedżerów kontekstu, co pozwala na używanie wielu linii bez wyraźnej kontynuacji linii:

with (
    open('my_file.log', 'r') as f,
    open('LocalLogFile.txt', 'a') as x
):
    for line in islice(f, 100, 150):
        print(line, file=x, end='')
2
chepner 27 czerwiec 2021, 17:13

x.write(''.join(lines))

Obecnie piszesz to jako reprezentację tablicy... ale musisz napisać to jako ciąg

-1
Joran Beasley 27 czerwiec 2021, 16:51

Chociaż odpowiedź innych jest słuszna, właściwym sposobem na to jest

with open('my_file.log', 'r') as f1:
    # f is an iterator
    # so instead of reading the whole file you can
    # go to the 100th line
    # suppose you you file has thousands of line

    for _ in range(100):
        next(f1)
        
    # now that you are at 100th line
    with open('LocalLogFile.txt', 'w') as f2:
        for i in range(50):
            f2.write(f1.readline().replace('\n', '')) #replace the newline character
            # no need to do next(f1 since f1.readline() will call next automatically)
0
Epsi95 27 czerwiec 2021, 17:09

Musiałbyś napisać każdy wiersz, a nie reprezentację listy w Pythonie.

Użyj także with do zarządzania plikami.

with open('my_file.log', 'rb') as text_file:
    lines = list(text_file)  # same as readlines

lines = lines[100:150]

with open("LocalLogFile.txt", "a") as x:
    x.write("".join(lines))
2
AKX 27 czerwiec 2021, 16:51