Как написать эффективный код readline на Python

Пытаюсь открывать и читать по одной строке из txt-файла, одновременно собирая информацию и составляя списки.

Итак, у меня есть что-то вроде этого:

name_list = []
rating_list = []
price_list = []
cuisine_list = []
end_list = []

filename = '/Users/anqixiao/Desktop/restaurant recommendation/restaurants_small.txt'
file = open(filename, 'r')
line = file.readline()

while line != '':
    name_list.append(line.strip('\n'))
    rating_list.append(line.strip('\n'))
    price_list.append(line.strip('\n'))
    cuisine_list.append(line.strip('\n'))
    end_list.append(line.strip('\n'))
file.close()

Однако Python Shell уже перестал отвечать, пока я вручную входил в цикл while. Может ли кто-нибудь пролить свет на то, где я ошибся? Я был бы очень признателен!

Большое спасибо.


person angie.x    schedule 29.03.2019    source источник
comment
Похоже, вы читаете первую строчку. Если эта строка не является пустой строкой, вы вводите цикл while, который затем будет выполняться вечно, так как вы не вносите никаких изменений в строку. Просто добавьте еще одну строку line = file.readline() внутри цикла while.   -  person NicoLazz    schedule 29.03.2019
comment
while line != '': никогда не выйдет из строя, если переменная line никогда не изменится внутри цикла. Вы продолжаете выполнять одни и те же операции в самой первой строке навсегда и всегда внутри цикла. (Когда вы используете цикл while, убедитесь, что вы пишете что-то внутри цикла, что вызывает изменение условного выражения)   -  person Paritosh Singh    schedule 29.03.2019


Ответы (4)


line относится к первой строке документа. Если это не пустая строка, она всегда будет истинной, пока не будет изменена. Чтобы изменить его для каждой новой строки, вы можете просто поставить line = file.readline() в конце цикла while

Обратите внимание, что file.readlines() будет читать, помещая каждую строку в file в список. file.readlines().splitlines() может раздеться за тебя

person Alec    schedule 29.03.2019

line = file.readline() будет читать строку из txt-файла, но когда вы вошли в цикл while, вы не читаете остальные строки снова и вы входите в бесконечный цикл. Вот почему вы получаете ошибки. поместите строку = file.readline() внутри цикла while после while line != '':

person Mark SuckSinceBirth    schedule 29.03.2019

Еще более экономичным подходом будет:

name_list = []
rating_list = []
price_list = []
cuisine_list = []
end_list = []

filename = '/Users/anqixiao/Desktop/restaurant recommendation/restaurants_small.txt'

with open (filename, 'r') as file:
    lines = file.readlines()


for line in lines:
    if line != '':
        name_list.append(line.strip('\n'))
        rating_list.append(line.strip('\n'))
        price_list.append(line.strip('\n'))
        cuisine_list.append(line.strip('\n'))
        end_list.append(line.strip('\n'))

Используя это, вы позволяете файлу иметь пустые строки и просто пропускаете их. Но, как указано в моем комментарии, ваша настоящая проблема - это бесконечный цикл while.

person NicoLazz    schedule 29.03.2019
comment
как насчет использования file.read().splitlines() вместо этого? Таким образом, вам не нужно раздеваться \n 5 раз. - person Remy; 29.03.2019
comment
@Rob Да, я считаю, что это правильный синтаксис. Я отредактировал свой оригинальный комментарий, спасибо. - person Remy; 29.03.2019

читать файл так:

with open(filename, 'r') as f:
    for line in f:
        #do something

если в каждой строке есть каждый элемент, например: "название, рейтинг, цена, кухня, конец", вы можете использовать split для получения элементов,
если строка содержания, например: "название\n рейтинг\n цена\n кухня\n конец" , это может быть работает

with open(filename, 'r') as f:
    for idx, line in enumerate(f):
        line = line.strip('\n')
        if idx % item_nums == 0:
            name_list.append(line)
        # other case
person dodopy    schedule 29.03.2019