Python - Как проверить, находится ли текст в файле txt?

119
7

У меня есть функция, которая проверяет, находится ли текст в file.txt или нет.

Функция работает следующим образом: если текст содержится в файле, файл закрывается. Если текст не содержится в файле, он добавляется.

Но это не сработает.

import urllib2, re
from bs4 import BeautifulSoup as BS

def SaveToFile(fileToSave, textToSave):
datafile = file(fileToSave)
for line in datafile:
if textToSave in line:
datafile.close()
else:
datafile.write(textToSave + '\n')
datafile.close()

urls = ['url1', 'url2'] # i dont want to public the links.

patGetTitle = re.compile(r'<title>(.*)</title>')

for url in urls:
u = urllib2.urlopen(url)
webpage = u.read()
title = re.findall(patGetTitle, webpage)
SaveToFile('articles.txt', title)
# so here. If the title of the website is already in articles.txt
# the function should close the file.
# But if the title is not found in articles.txt the function should add it.

спросил(а) 2015-12-21T14:58:00+03:00 4 года, 9 месяцев назад
1
Решение
70

Вы можете изменить функцию SaveToFile следующим образом:

Ваш title - это список, а не строка, поэтому вы должны называть его как этот SaveToFile('articles.txt', title[0]) чтобы получить первый элемент списка

def SaveToFile(fileToSave, textToSave):
with open(fileToSave, "r+") as datafile:
for line in datafile:
if textToSave in line:
break
else:
datafile.write(textToSave + '\n')

Заметки:

    Поскольку вы очень зацикливаетесь на пустой файл, цикл даже не запускался один раз.

то есть)

for i in []:
print i # This will print nothing since it is iterating over empty list same as yours
    Вы передали list а не string так как re.findall возвращает объект списка, re.findall вы должны передать первый элемент списка функции. Я использовал для for..else здесь, если цикл не завершился должным образом, иначе дело будет работать.

то есть)

for i in []:
print i
else:
print "Nooooo"

Вывод:

Nooooo

ответил(а) 2015-12-21T15:27:00+03:00 4 года, 9 месяцев назад
57

Просто используйте режим r+ следующим образом:

def SaveToFile(fileToSave, textToSave):
with open(fileToSave, 'r+') as datafile:
if textToSave not in datafile.read():
datafile.write(textToSave + '\n')

Об этом файловом режиме, из этого ответа:

''r+''  Open for reading and writing.  The stream is positioned at the  
beginning of the file.

И re.find_all() всегда возвращает список, поэтому, если вы пытаетесь написать список вместо строки, вы получите сообщение об ошибке.

Таким образом, вы можете использовать:

def SaveToFile(fileToSave, textToSave):
if len(textToSave) => 1:
textToSave = textToSave[0]
else:
return

with open(fileToSave, 'r+') as datafile:
if textToSave not in datafile.read():
datafile.write(textToSave + '\n')

ответил(а) 2015-12-21T15:26:00+03:00 4 года, 9 месяцев назад
57

Вам нужно реорганизовать функцию SaveToFile, чтобы это было так.

def SaveToFile(fileToSave, titleList):
with open(fileToSave, 'a+') as f:
data = f.read()

for titleText in titleList:
if titleText not in data:
f.write(titleText + '\n')

f.close()

Эта функция считывает содержимое файла (если оно существует или создается, если нет) и проверяет, находится ли textToSave в содержимом файла. Если он нашел textToSave, тогда закройте файл, иначе напишите содержимое в файл.

ответил(а) 2015-12-21T15:13:00+03:00 4 года, 9 месяцев назад
40

Это похоже на вашу проблему.

Это проверяет, есть ли текст в файле:

def is_text_in_file(file_name, text):
with open(file_name) as fobj:
for line in fobj:
if text in line:
return True
return False

Это используется вышеприведенная функция для проверки и записи текста в конец файла, если он еще не находится в файле.

def save_to_file(file_name, text):
if not is_text_in_file in (file_name, text):
with open(file_name, 'a') as fobj:
fobj.write(text + '\n')

ответил(а) 2015-12-21T15:06:00+03:00 4 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема