20

Как читать файл построчно в список?

11

Как считать каждую строку файла в Python и сохранить их как элементы в списке?

Я пытаюсь считать файл построчно в Python и сохранить каждую строку как элемент в списке. Мне нужно, чтобы каждая строка файла добавлялась в конец списка.

Вот что я пробовал:

# Пример кода
lines = []
with open('myfile.txt', 'r') as file:
    for line in file:
        lines.append(line.strip())  # Убираем символы новой строки

print(lines)

Тем не менее, у меня возникли некоторые вопросы. Во-первых, правильно ли я использую strip() для удаления символа новой строки? Есть ли более эффективные способы сделать это? И, кроме того, как обработать возможные ошибки, такие как отсутствие файла или проблемы с кодировкой?

Заранее благодарю за помощь!

4 ответ(ов)

7

Это более подробно, чем нужно, но выполняет вашу задачу.

with open("file.txt") as file_in:
    lines = []
    for line in file_in:
        lines.append(line)

Этот код открывает файл file.txt, читает его построчно и добавляет каждую строку в список lines. Хотя этот способ работает, можно упростить код, используя следующий подход:

with open("file.txt") as file_in:
    lines = file_in.readlines()

Это будет более компактно и читабельно, так как readlines() сразу возвращает все строки из файла в виде списка.

3

Данный код создаст "кортеж" строк из файла.

lines = tuple(open(filename, 'r'))

Функция open возвращает объект файла, по которому можно итерироваться. При итерации по файлу вы получаете строки из этого файла. Функция tuple может принимать итераторы и создавать экземпляр кортежа на основе указанного итератора. В результате переменная lines будет кортежем, содержащим строки из файла.

2

Если вы хотите включить \n в конце каждой строки:

with open(fname) as f:
    content = f.readlines()

Если вы не хотите, чтобы \n включался:

with open(fname) as f:
    content = f.read().splitlines()

Таким образом, readlines() сохраняет символы новой строки, а splitlines() удаляет их.

1

Вы могли бы просто сделать следующее, как уже было предложено:

with open('/ваш/путь/к/файлу') as f:
    my_lines = f.readlines()

Однако у этого подхода есть два недостатка:

  1. Вы сохраняете все строки в памяти. В общем случае это очень плохая идея. Файл может быть очень большим, и у вас может не хватить памяти. Даже если файл не большой, это просто напрасная трата ресурсов.

  2. Это не позволяет обрабатывать каждую строку по мере их чтения. Если вы обрабатываете строки после этого, это неэффективно (требует два прохода вместо одного).

Лучший подход в общем случае следующий:

with open('/ваш/путь/к/файлу') as f:
    for line in f:
        process(line)

При этом вы можете определить функцию обработки так, как вам удобно. Например:

def process(line):
    if 'спасите мир' in line.lower():
        superman.save_the_world()

(Реализация класса Superman оставлена вам как упражнение).

Этот подход будет хорошо работать с файлами любого размера, и вы будете проходить по файлу всего за один проход. Обычно именно так работают универсальные парсеры.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь