Чтение содержимого файла с циклом for в Python - PullRequest
0 голосов
/ 07 января 2019

Вот проблема. У меня есть файл names.txt. Содержимое этого файла выглядит следующим образом. Вопрос просит отобразить номера имен в этом файле. Я мог бы сделать с пока цикл. Работает, без проблем. Но по какой-то причине, если бы я хотел сделать это с циклом для , это выдает мне неправильное количество имен.

    Julia Roberts 
    Michael Scott
    Kevin Malone
    Jim Halpert
    Pam Halpert
    Dwight Schrute

Это цикл while. Работает отлично.

def main():
    try:
        # open the names.txt file in read mode.
        infile=open("names.txt", "r")

        # set an accumulator for number of names
        numbers_of_name=0.0

        # read the first line
        line=infile.readline()

        # read the rest of the file
        while line!="":
            numbers_of_name+=1
            line=infile.readline()

        # print the numbers of names in the names.txt file.    
        print("There are", int(numbers_of_name), "names in the names.txt file.")

        # close the file
        infile.close()
    except IOError as err:
        print (err) 

# call the main function
main()

Консоль дает мне правильный ответ.

There are 6 names in the names.txt file.

А это мой проблемный цикл

def main():
    try:
        # open the names.txt file in read mode.
        infile=open("names.txt", "r")

        # set an accumulator for number of names
        numbers_of_name=0.0

        # read the rest of the file
        for line in infile:
            line=infile.readline()
            numbers_of_name+=1

        # print the numbers of names in the names.txt file.    
        print("There are ", numbers_of_name, "names in the names.txt file.")

        # close the file
        infile.close()
    except IOError as err:
        print (err) 

# call the main function
main()

И это вывод.

There are  3.0 names in the names.txt file. 

Там должно быть 6 имен, а не 3 имени .:

Что может отсутствовать в этом коде чтения файла? Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 07 января 2019
# Initialise count
count = 0
with open('bar.py', 'r') as fd:
  # Strip newline char and and any leading/trailing spaces
  lines = map(lambda x: x.strip(), fd.readlines())

  # Strip empty lines
  lines = filter(lambda x: x, lines)

  # Get the count
  count = len(lines)
print "Count: ", count

Примечание: При использовании карты и фильтра мы дважды перебираем список. Эффективная реализация (для большого списка) будет состоять в том, чтобы перебирать элементы только один раз и применять условия для удаления нежелательных записей - пустых строк, строк, начинающихся с # и т. Д.

0 голосов
/ 07 января 2019

Эта строка даст то, что вы пытаетесь сделать со всем этим кодом:

len(open("names.txt", "r").readlines())

Цикл не требуется для подсчета количества строк.

0 голосов
/ 07 января 2019

Проблема с этим разделом

# read the rest of the file
for line in infile:
    line=infile.readline()
    numbers_of_name+=1

Если вы сделаете печать в разрезе, вы поймете, почему:

# read the rest of the file
for i, line in enumerate(infile):
    print (i, line)
    line=infile.readline()
    print (i, line)
    numbers_of_name+=1

Делая line=infile.readline(), вы изменяете значение line в цикле for и изменяете его для последующего прохода цикла

0 голосов
/ 07 января 2019

Проблема в том, что вы читаете две строки в каждой итерации, когда делаете:

for line in infile:

строка - это первая строка в файле, когда вы делаете:

line.readline()

Тогда строка теперь является второй строкой, а затем вы добавляете одну, две, на ваше имя count

Вы должны сделать:

for line in infile:
    numbers_of_name+=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...