#python #regex #count
#python #регулярное выражение #подсчет
Вопрос:
Я пытаюсь подсчитать, сколько раз «тип» появляется в текстовом файле, и мне нужно включить следующее слово. Например, сколько раз «введите A» или «введите яблоки» отображается в нескольких файлах. Я зашел так далеко, но вместо подсчета он показывает по одному для каждого. Я подумал, что было бы лучше хранить в словаре, чтобы я мог ввести, а затем посчитать.
current output
file 1.txt {type A : 1}
file 1.txt {type A : 1}
file 2.txt {type apples : 1}
file 2.txt {type apples : 1}
Однако это то, что я хотел бы. Я новичок в python, поэтому чувствую, что я упускаю что-то очевидное.
expected output
file 1.txt {type A : 2}
file 2.txt {type apples : 2}
это код, который у меня есть до сих пор
def find_files(d):
for root, dirs, files in os.walk(d):
for filename in files:
if filename.endswith('.txt'):
yield os.path.join(root, filename)
for file_name in find_files(d):
with open(file_name, 'r') as f:
for line in f:
results = defaultdict(int)
line = line.lower().strip()
match = re.search('type (S )', line)
if match:
results[match.group(0)] = 1
print(file_name, results)
Комментарии:
1. Создайте словарь с соответствующими текстовыми ключами, которые сопоставляются с целочисленным значением, которое подсчитывает, сколько раз оно было просмотрено. Выполнение этого можно было бы несколько упростить, используя a
collections.defaultdict(int)
, который являетсяdict
подклассом.
Ответ №1:
Несколько ошибок:
- вы создаете новый словарь для каждой строки; лучше создать один для каждого файла
re.search
найдет первое совпадение в строке; вы могли бы использоватьre.findall
, чтобы найти все совпадения
Вот исправленная версия вашего кода:
for file_name in find_files(d):
with open(file_name, 'r') as f:
results = defaultdict(int)
for line in f:
line = line.lower().strip()
matches = re.findall('type (S )', line)
if matches:
for word in matches:
results[word] = 1
print(file_name, results)