#python
Вопрос:
Я читаю файл журнала, содержащий несколько строк, и записываю его в текстовый файл. выходные данные записываются в файл в виде одной длинной строки : [‘Бла Бла Блан Бла Бла Блан’] В исходном файле строка за строкой выглядит нормально. Чтение делается вот так:
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)
Есть идеи, как решить эту проблему, чтобы она выглядела как оригинальный файл?
Ответ №1:
Здесь есть несколько проблем:
- Открытие текстового файла в двоичном режиме
- Считывание всего файла в память
- Попытка записать список в новый файл вместо нескольких отдельных строк.
Используйте itertools.islice
для создания нового итератора, который пропускает первые 100 строк, а затем выдает следующие 400 строк, которые вы можете повторить, используя обычный for
цикл для записи в выходной файл.
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='')
Некоторые могут предпочесть одно 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='')
или
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 позволит заключать в скобки несколько контекстных менеджеров, позволяя использовать несколько строк без явного продолжения строки:
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='')
Комментарии:
1. Круто, но
print(line, file=x)
дает именно тот результат, которого ОП не хочет.2. Нет, это не так;
line
это одна строка из файла, а не список строк.3. (Я действительно забыл либо удалить новую строку,
line
либо подавить дополнительную новую строку, которая4. Айлис сделал свое дело ! Огромное спасибо!
Ответ №2:
Вам нужно будет записать каждую строку, а не представление списка на Python.
Также используется with
для управления файлами.
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))
Ответ №3:
Хотя ответ другого верен, правильный способ сделать это таков
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', 'a') as f2:
for i in range(50):
f2.write(f1.readline())
# no need to do next(f1 since f1.readline() will call next automatically)
Комментарии:
1. Спасибо, но это не работает : если я использую ваш пример 1:1, он снова записывает информацию в одну длинную строку, но без n…во — вторых — я использую переменные вместо фактического номера строки, а когда я их вставляю — файл пуст-в консоли нет ошибок. есть какие-нибудь идеи?
2. Попробовал iSlice, упомянутый выше, — теперь работает нормально … спасибо 🙂
3. Я удалил
'replace('n', '')
символ, который заменял символ новой строки. Также с переменной это должно работать просто отлично @TheWiz
Ответ №4:
x.write(''.join(lines))
в настоящее время вы пишете его как представление массива… но вам нужно записать его в виде строки
Комментарии:
1. В массивах нет
join
метода. Это''.join(lines)
.