Функция, которая загрузит текстовый файл и ее результатом будет словарь

Функция, которая загрузит текстовый файл и ее результатом будет словарь, содержащий все слова и числа фигурирующие в тексте с указанием количества их появлений. Слова они состоят из букв английского алфавита (верхнего и нижнего регистра) и могут быть разделены не только пробелами, но и другими небуквенными символами. Буквы не чувствительны к регистру(«Аnnа», «АNNА», - одно и то же слово). Числа состоят из цифр, которым может предшествовать знак минус ('-') и могут содержать десятичную точку. Параметры вызова функции должны быть: имя (вместе с путем) файл и кодовую таблицу, которая использовалась для сохранения файла. Если в файле нет слов или цифр, то полученный словарь будет пустым. Результатом функции для файла с текстом “Anna, ANNA, 45.65, 77d54, 77” , будет: {‘Anna’ :1, 45.65 : 1, **77:2, ‘d’:1, 54:1} Как указать, что буквы нечувствительны к регистру?

Это то, что я сумела написать. Может кто-то подсказать, какие здесь ошибки и почему он не работает?

plik= open('plik.txt','r')
tekst = plik.readlines()
n = tekst.sort()
for x in n:
    if tekst.count(x)>1 : 
        dict('x', n.keys)
    n.keys= tekst.count()
    elif tekst.count(x)=0:
        print({})

Ответы (1 шт):

Автор решения: Евгений

Для разделения текста по "небуквенным разделителям" можно использовать метод re.split(pattern, string) из модуля re:

def count_words_in_file(filename:str)->dict:
  try:
    f = open(filename, 'rt')
  except Exception:
    f.close()
    return {}
  
  import re
  text_words = re.split(r'[^A-Za-z]', f.read())
  result = {}
  for word in text_words:
    if word:
      if word.lower() in result:
        result[word.lower()] += 1
      else:
        result.update({word.lower():1})

  f.close()
  return result


from pprint import pprint
pprint(count_words_in_file('text.txt'))

Текстовый файл:

hello, my sweet world! 
U r SO SWEET!!!Are u my world?!

Результат:

{'are': 1, 'hello': 1, 'my': 2, 'r': 1, 'so': 1, 'sweet': 2, 'u': 2, 'world': 2}
→ Ссылка