Почему `toml.load (f)` терпит неудачу с этим файлом в Windows (но не в Linux)? - PullRequest
2 голосов
/ 11 марта 2020

У меня есть TOML файл, который я хочу обработать с этим сценарием .

Это нормально работало при Linux. При Windows (Python 3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:23:52) [MSC v.1900 32 bit (Intel)] on win32) я получаю следующую ошибку:

Need to process 1 file(s)
Processing file test01.toml (1 of 1)
Traceback (most recent call last):
  File "py/process.py", line 27, in <module>
    add_text_fragment(input_dir + "/" + file)
  File "<string>", line 10, in add_text_fragment
  File "C:\Users\1\Anaconda3\lib\site-packages\toml\decoder.py", line 134, in lo
ad
    return loads(f.read(), _dict, decoder)
  File "C:\Users\1\Anaconda3\lib\encodings\cp1251.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 985: char
acter maps to <undefined>

Я предполагаю, что ошибка происходит где-то здесь:

f = open(toml_file_name, "r")
pt = toml.load(f)
f.close()

Согласно NotePad ++, Файл , о котором идет речь, имеет кодировку UTF-8.

Как я могу это исправить?

Условия вознаграждения

Я награждаю этим Награда человеку, который показывает мне, как убедиться, что скрипт process.py правильно обрабатывает входной файл , т.е. выполнение проходит мимо комментария, начинающегося с If at this point pt в addTextFragment.py

def add_text_fragment(toml_file_name):
    f = open(toml_file_name, "r")
    pt = toml.load(f)
    f.close()

    # If at this point pt contains dthe data of the input file,
    # then you have attained the goal.
    if (pt["type"] == "TA"):

и переменная pt содержит данные из входного файла .

Ваше решение должно работать в Windows 10, Python 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32.

Примечание: process.py выполняет addTextFragment.py для всех файлов в определенном каталоге.

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Просто замените эту строку:

f = open(toml_file_name, "r")

на:

f = open(toml_file_name, "r", encoding="utf-8")

Как видно из сообщения об ошибке, Python пытается прочитать файл с системой по умолчанию кодировка для файлов - если файл содержит любые символы, отличные от ASCII, и работал в Linux, это означает, что он имеет другую кодировку - и кодировка по умолчанию для всего мира, отличного от Windows, - utf-8.

1 голос
/ 17 марта 2020

похоже, что Томл пытался расшифровать ваши данные, но потерпел неудачу. Как вы сказали, данные в вашем toml-файле имеют кодировку UTF-8. Я бы расшифровал его вручную, чтобы избежать возможного обнаружения кодировки в toml lib.

with open(toml_file_name, 'rb') as f:
    pt = toml.loads(f.read().decode('utf-8'))
...