Python — Запись в файл записывается в виде одной длинной строки [‘textn…текстn…’] — нужно, чтобы он был оригиналом

#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:

Здесь есть несколько проблем:

  1. Открытие текстового файла в двоичном режиме
  2. Считывание всего файла в память
  3. Попытка записать список в новый файл вместо нескольких отдельных строк.

Используйте 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 либо подавить дополнительную новую строку, которая print будет выводиться; теперь я это исправил.)

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