Не принимать определенные символы при записи в текстовый файл Python - PullRequest
0 голосов
/ 02 января 2019

В конце своей функции я записываю результаты в текстовый файл, который создается потому, что он не существует, как таковой:

new_file = charity + ".txt"
with open(new_file, "w") as handle:
    handle.write("Matches found for " + charity.upper() + " in order of compatibility:\n")
    for item in match_lst:
            handle.write("Grant: " + item[2] + ". Funding offered: " + int_to_str(item[1]))
            handle.write("Number of matches: " + str(item[0] - 1) + "\n")
    handle.close()

Моя проблема заключается в том, что при записи вновый файл, кажется, он не признает символ новой строки, символ «£» и символ апострофа.Чтобы показать, о чем я говорю, вот выдержка из выходного файла:

Matches found for BLA in order of compatibility:
Grant: The Taylor Family Foundation. Funding offered: �500,000.00Number of matches: 1
Grant: The Peter Cruddas Foundation. Funding offered: �200,000.00Number of matches: 1
Grant: The London Marathon Charitable Trust Limited - Major Capital Project 
Grants. Funding offered: �150,000.00Number of matches: 1
Grant: The Hadley Trust. Funding offered: �100,000.00Number of matches: 1
Grant: The Company Of Actuaries� Charitable Trust Fund. Funding offered: �65,000.00Number of matches: 1
Grant: The William Wates Memorial Trust. Funding offered: �50,000.00Number of matches: 1
Grant: The Nomura Charitable Trust. Funding offered: �50,000.00Number of matches: 1
Grant: The Grocers� Charity. Funding offered: �40,000.00Number of matches: 1

Для справки вот информация (то есть match_lst), которую я пытаюсь записать в ее исходной структуре данных

[(2, 500000.0, 'The Taylor Family Foundation', ['Young People', 'Arts Or Heritage', 'Social Reserarch'], ['Registered Charity']), 
(2, 200000.0, 'The Peter Cruddas Foundation', ['Young People'], ['Registered Charity', 'Other']),
(2, 150000.0, 'The London Marathon Charitable Trust Limited - Major Capital Project Grants', ['Infrastructure Support', 'Sport And Recreational Activities'], ['Registered Charity', 'Limited Company', 'Other']), 
(2, 100000.0, 'The Hadley Trust', ['Social Relief And Care', 'Crime And Victimisation', 'Young People', 'Social Reserarch'], ['Registered Charity', 'Limited Company']), 
(2, 65000.0, 'The Company Of Actuaries’ Charitable Trust Fund', ['Young People', 'Disabilities', 'Social Relief And Care', 'Medical Research'], ['Registered Charity']), 
(2, 50000.0, 'The William Wates Memorial Trust', ['Young People', 'Arts Or Heritage', 'Sport And Recreational Activities'], ['Registered Charity', 'Other']), 
(2, 50000.0, 'The Nomura Charitable Trust', ['Young People', 'Education And Learning', 'Unemployment'], ['Registered Charity']), 
(2, 40000.0, 'The Grocers’ Charity', ['Poverty', 'Young People', 'Disabilities', 'Healthcare Sector', 'Arts Or Heritage'], ['Registered Charity']) ]

Как видите, здесь все символы напечатаны нормально.

Для дальнейшего контекста, вот моя простая функция int_to_str:

def int_to_str(num_int):
if num_int == 0:
    return "Discretionary"

else:
    return '£' + '{:,.2f}'.format(num_int)

Итак, мой вопросКак я могу исправить это, чтобы напечатать все символы, которые отсутствуют / закодированы?

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Кажется, что каждая строка записывается в новую строку, так как строки не кажутся одним непрерывным текстом, символ \n в выводе просто скрыт.Чтобы исправить проблему с кодировкой, необходимо указать кодировку в команде открытия файла:

with open(new_file, 'w', encoding="utf-8") as handle:
    ...

Я опубликую это как ответ для будущих посетителей вопроса.

Спасибо

0 голосов
/ 02 января 2019

Трудно угадать без подробностей. Во всяком случае, это действительно проблема с кодировкой. Давайте посмотрим на некоторые символы, которые не отображаются правильно:

  • символ новой строки - известно, что он зависит от ОС: он \n один в Unix-подобных системах и \r\n (2 символа) в Windows.
  • '£' или ЗНАК. Это символ Unicode U + 00A3. В кодовой странице Windows 1252 или в Latin1 (ISO-8859-1) это один байт b'\xa3', а в utf8 он кодируется как b'\xc2\xa3'. Еще более интересно то, что если вы попытаетесь отобразить b'\xa3' в UTF-8, вы получите ЗАМЕНУ ХАРАКТЕРА U + FFFD, которая читается как '�'.
  • символ апострофа. true APOSTROPHE ("'") является символом ASCII U + 0027. Здесь нет проблем. Но он может быть тихо заменен на ПРАВУЮ КВАРТИРУЮЩУЮ КАРТУ (U + 2019 или "’" некоторыми редакторами с поддержкой юникода. Просто его нет ни в кодовой странице Windows 1252, ни в Latin1 ...

Все это просто означает, что детали имеют значение . Не зная точно, как вы читаете данные из бинарного файла и как он был построен, невозможно объяснить, что на самом деле происходит. Текстовый файл - это абстракция. Настоящие текстовые файлы - это последовательности байтов с заданной кодировкой и соглашениями конца строки.

...