Вопрос о коде для поиска слов без определенных букв в текстовом файле - PullRequest
1 голос
/ 28 апреля 2020

В настоящее время я работаю над вводной python книгой под названием "Думай Python". В одном из упражнений я должен написать программу, которая принимает строку символов и подсчитывает, сколько слов в файле с именем "words.txt" (http://greenteapress.com/thinkpython2/code/words.txt) не имеют букв из эта строка символов.

Мой код здесь:

fin = open('words.txt')

def avoids(word,forbidden):
    avoided=True 
    for i in forbidden:
        if i in word: 
            avoided=False
            break #break out of for loop
    if avoided==True:
        return avoided 

def number_avoids(forbidden):
    """Finds number of words excluded by character"""
    avoided=0
    for line in fin:
        if avoids(line,forbidden):
            avoided+=1
    return avoided

print(number_avoids("a"))
print(number_avoids("a"))

Хотя меня смущает, почему я получил два разных ответа для одного и того же кода. Для первого print(number_avoids("a")) результат составил 57196. Для второго программа напечатала 0. Может ли кто-нибудь объяснить мне, почему один и тот же код выдаст два разных ответа?

Спасибо.

1 Ответ

4 голосов
/ 28 апреля 2020

Проблема

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

Но, когда вы вызываете функцию во второй раз, cursor находится в Конце файла . Итак, больше нет символов для чтения. Вы можете проверить это, добавив оператор print(line) внутри функции l oop из number_avoids.

Решение

Есть встроенная функция для перемещения курсора файла. Вы можете использовать его, чтобы переместить курсор в исходное положение:

...
print(number_avoids("a"))
fin.seek(0)
print(number_avoids("a"))

. Он переместит ваш курсор в начало файла. Таким образом, все содержимое файла будет прочитано и оценено снова.

Примечание : Я попытался сделать этот ответ как базовый c, насколько это возможно, чтобы его можно было понять кто-нибудь без знания обработки файлов. Не стесняйтесь спрашивать любые пояснения в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...