функцию, которая загрузит текстовый файл и ее результатом будет словарь
Нужно разработать функцию, которая загрузит текстовый файл и ее результатом будет словарь, содержащий все слова и числа фигурирующие в тексте с указанием количества их появлений. Слова они состоят из букв английского алфавита (верхнего и нижнего регистра) и могут быть разделены не только пробелами, но и другими небуквенными символами. Буквы не чувствительны к регистру(«Аnnа», «АNNА», - одно и то же слово). Числа состоят из цифр, которым может предшествовать знак минус ('-') и могут содержать десятичную точку. Параметры вызова функции должны быть: имя (вместе с путем) файл и кодовую таблицу, которая использовалась для сохранения файла. Результатом функции для файла с текстом “Anna, ANNA, 45.65, 77d54, 77, 5,6” , будет: {‘anna’:2, 45:1, 65:1, 77:2, ‘d’:1, 54:1, 5,6:1}
Вот код который я написала, объясните, пожалуйста, где ошибка и почему он не работает
def wlicznik(nazwa_pliku,kodowanie='utf-16'):
with open(nazwa_pliku,'r',encoding=kodowanie) as f:
tekst = f.readlines()
print (tekst)
Dict = {}
for line in tekst:
for i in range(len(line)):
if line[i].isdigit():
import re
from re import split
a = split(r"(([-])?[0-9]+([,]{1}[0-9]+)?)", line)
for n in a: float(n[0].replace(",",".")
c = n.count
for n in a:
if a not in Dict_n():
Dict_n= {n:c}
else:
Dict_n[a]= Dict_n[a]+ 1
elif line[i].isalpha():
import re
text_words = re.split(r'[^A-Za-z]', f.read())
for word in text_words:
if word:
if word.lower() in Dict:
Dict_w[word.lower()] += 1
else:
Dict_w.update({word.lower():1})
Dict.update(Dict_n+Dict_w)
return Dict
f.close()***
Ответы (2 шт):
Восстановить Ваш код сложновато отступы как повезет и ошибок много.
По описанию написал функцию с начала. Получается примерно так:
import re
def wlicznik(nazwa_pliku,kodowanie='utf-8'):
with open(nazwa_pliku, mode="r", encoding=kodowanie) as wf:
i = wf.read().lower() # Переводим все в нижний регистр
# Обрабатываем строку без цифр
no_digit = re.sub(r'[^\w\s\,]+|[\d]+|[\ ,]', r' ',i) #
no_digit = re.split(' |\n', no_digit)
no_digit = [value for value in no_digit if value != '']
# Обрабатываем строку без букв
digit = re.sub(r'[^\d\.\,]+|\,\s', r' ',i)
digit = digit.replace(",", ".")
digit = re.split(' |\n', digit)
digit = [value for value in digit if value != '']
digit = [value for value in digit if value != ',']
itog = (no_digit + digit)
# Подсчитываем значения
arr = {}.fromkeys(itog, 0) # преобразование в словарь
for a in itog:
arr[a] += 1
print(arr)
# Ну и собственно вызов функции
wlicznik("test.txt", "utf-8")
Подходит?
Можно сделать без регулярок за один проход:
- перебираем строку, проверяя каждый символ.
- если символ подходящий (цифра, буква) и соответствует предыдущему, кладём его в аккумулятор. Запятую обрабатываем отдельно, она может быть как частью, так концом последовательности.
- если символ неподходящий или не соответствует предыдущему - очередная последовательность закончилась, добавляем содержимое аккумулятора (если он не пустой) в словарь, обнуляем аккумулятор и начинаем наполнять заново.
Решение:
Предполагается, что после запятой всегда идёт пробел или цифра.
def convert_to_dict(string, dct):
def add_to_dict():
nonlocal accum
accum = accum.lower()
dct.setdefault(accum, 0)
dct[accum] += 1
accum = ""
accum = ""
string_iterator = iter(string)
for char in string_iterator:
# Если это алфавитный или числовой символ - короткая версия
if char.isalnum():
if accum != "" and accum[-1].isalpha() != char.isalpha():
add_to_dict()
accum += char
# Если это алфавитный или числовой символ - длинная, но более понятная версия
# if char.isalpha():
# if accum != "" and not accum[-1].isalpha():
# add_to_dict()
#
# accum += char
#
# elif char.isdigit():
# if accum != "" and not accum[-1].isdigit():
# add_to_dict()
#
# accum += char
else:
if char == ',':
next_char = next(string_iterator)
if next_char.isdigit():
accum += '.' + next_char
continue
add_to_dict()
# Проверяем, не осталось ли что-нибудь в аккумуляторе.
if accum != "":
add_to_dict()
with open("input.txt") as fd:
result_dct = {}
# Можно читать файл построчно, передавая каждую строку отдельно
for line in fd:
convert_to_dict(line, result_dct)
# А можно передать сразу весь файл
# convert_to_dict(fd.read(), result_dct)
print(result_dct)
Тестирование
Содержимое файла input.txt:
Anna, ANNA, 45.65, 77d54, 77, 5,6
56a45, 45, 5,6, 78.70
Результат
{'anna': 2, '45': 3, '65': 1, '77': 2, 'd': 1, '54': 1, '5.6': 2, '56': 1, 'a': 1, '78': 1, '70': 1}