поиск строки в файле с помощью python faliure

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

tempPath = input("Please Enter the Path of the File\n")
temp_file = open(tempPath, "r")
fileContent = temp_file.read()
temp_file.close()

pattern_normal = re.compile("[-a-zA-Z0-9._][email protected][-a-zA-Z0-9_]+.[a-zA-Z0-9_.]+")

pattern_normal_list = pattern_normal.findall(str(fileContent))

with open('emails_file.txt', 'a+') as f:            
    for item in pattern_normal_list:            
        for line in f:
            if line in item:
                print("duplicate")
            else:
                print("%s" %item)
                f.write("%s" %item)
                f.write('\n')
0
nl ja de
Проблема в том, что при первом запуске этот emails_file.txt будет пустым, поэтому строка не будет читать, поэтому вы никогда не сможете ее добавить. @Torxed показывает вам решение.
добавлено автор sotapme, источник

2 ответы

for line in f:

Не следует ли сначала вызвать f.readlines ()?

lines = f.readlines()
for line in lines:

Проверь это.

2
добавлено
Вам не нужно использовать оператор с open() как f , он по существу сбрасывается до, f является файловым дескриптором, и если вы повторяете этот дескриптор файла, вы получите одну строку на время по умолчанию в Python.
добавлено автор Torxed, источник
Достаточно справедливо, это не требование, но должно быть в описанном использовании :) Но опять же, вы правы, +1
добавлено автор Torxed, источник
@Torxed: но только один раз; OP пытается просмотреть весь файл для каждого элемента в списке, который не будет работать без seek() (хотя я согласен, что этот ответ может быть более ясным).
добавлено автор geoffspear, источник
@Torxed: для этого вам не нужен оператор with . Открытие файла с помощью f = open (filename) и чтение с помощью для строки в f . Конечно, использование с всегда является хорошей идеей.
добавлено автор Matthias, источник

Новое решение:

tempPath = input("Please Enter the Path of the File\n")
temp_file = open(tempPath, "r")
fileContent = temp_file.read()
temp_file.close()

pattern_normal = re.compile("[-a-zA-Z0-9._][email protected][-a-zA-Z0-9_]+.[a-zA-Z0-9_.]+")

addresses = list(set(pattern_normal.findall(str(fileContent))))
with open('new_emails.txt', 'a+') as f:
    f.write('\n'.join(addresses))

Я думаю, что ваша логика была неправильной, это работает:

addresses = ['[email protected]', '[email protected]']

with open('emails_file.txt', 'a+') as f:
    fdata = f.read()
    for mail in addresses:
        if not mail in fdata:
            f.write(mail + '\n')

Не прочитав много кода, похоже, что вы зацикливаете строки по очереди, проверяя, существует ли в строке адрес, который вы также зацикливаете, если вы не добавляете к нему свой адрес электронной почты? Но в 99% из 100 строк адрес не будет в строке, поэтому вы получите нежелательное дополнение.

Вывод моего фрагмента кода:

[[email protected] ~]$ cat emails_file.txt 
[email protected]
[email protected]
[[email protected] ~]$ python test.py 
[[email protected] ~]$ cat emails_file.txt 
[email protected]
[email protected]
[email protected]
[[email protected] ~]$ 
1
добавлено
Я понял, что моя логика ошибочна. Но я изменил, поскольку вы сказали, что он пишет дубликаты записей. Исходный файл, в котором я получаю электронные письма, содержит дубликаты записей. Этот код записывает их все в файл emails.txt. Измененный фрагмент кода: с открытым ('emails_file.txt', 'a +') как f: fdata = f.read() для элемента в pattern_normal_list: если элемент не в fdata: print ("% s"% item) f. write ("% s"% item) f.write ('\ n')
добавлено автор direndd, источник
Добавлена ​​обновленная версия, в которой вы 1 читаете файл, содержащий douplicate адреса электронной почты. Затем отфильтруйте это .. подождите минуту .. erm ..
добавлено автор Torxed, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community