Является ли использование readlines () лучшим подходом, чем создание списка? - PullRequest
0 голосов
/ 26 февраля 2019

Сегодня я просматривал некоторые заметки и наткнулся на следующий фрагмент кода:

def read_entire_file(file):
    with open(file) as f_obj:
        contents = f_obj.readlines()
    print(contents)
    print(type(contents)) # I added this line

Быстрый взгляд, и похоже, что я перезаписываю переменную каждой строкой, которую читаю, однако, он создает список, и вы можете проверить, что contents является списком с помощью метода type().

Сравните это с этим кодом:

def read_file_into_list(file):

    employees = []

    with open(file) as f_obj:
       for line in f_obj:
           employees.append(line.strip())
    print(employees)

Там, где я могу быстро увидеть, я создал список employee, и я читаю в каждой строке и добавляю к списку.

Из этой ссылки мне известно, что он считывает весь файл в память, но если вы хотите создать список из данных, какой подход лучше?

Мне нравится второй подход, хотя он немного больше кода, понятно, что я делаю, в то время как первый подход не совсем понятен, пока вы не осмотрите его дальше.

1 Ответ

0 голосов
/ 26 февраля 2019

Быстрый взгляд и похоже, что я перезаписываю переменную каждой строкой, которую читаю ...

Почему это так?Вы видите with как while?Я привык к первому, и на первый взгляд мне кажется, что он просто: вызов readlines() для чтения всего файла.

Где я могу быстро увидетьНа первый взгляд, я создал список сотрудников, и я читаю в каждой строке и добавляю к List.

Когда я вижу явные циклы for и while, которые работают один элемент или одинПостепенно я впервые подумал: «Выглядит как программист на C ++ или Java, который не привык к Python».Это привычка, из которой вы должны избавиться.В Python часто есть более идиоматический подход, использующий массовые операции, списки или генераторы, которые избегают обязательного цикла старой школы.

Мне нравится второй подход, хотя он немного больше кода, понятночто я делаю, хотя при первом подходе не совсем понятно, пока вы не осмотрите его дальше.

Как опытный программист Python, я предпочитаю первый.Если вы хотите прочитать файл в память, вы звоните readlines().Он делает то, что говорит на жестяной банке.

Тем не менее, я также хотел бы спросить, является ли чтение всего файла в память правильным решением.Возможно, вам следует обрабатывать его построчно, не разжевывая целую кучу памяти.В этом случае идиоматическим решением действительно является петля for.Но не тот, в котором вы просто добавляете все элементы в список.

with open(file) as f_obj:
    for line in f_obj:
        process_line(line.strip())

В качестве альтернативы, если важно удалить пробел и вы хотите прочитать все в память, рассмотрите понимание списка.

with open(file) as f_obj:
    employees = [line.strip() for line in f_obj]
...