Как написать код указывает на файл без преобразования их в строку? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть JSON файл, полный символов разных типов. Я использую это для проекта НЛП. Мне нужно загрузить текст в словарь, а затем записать ключи, как они есть, в другой файл для дополнительной предварительной обработки. Текст, о котором идет речь, представляет собой смесь цифр, букв и символов. Проблема в том, что когда я записываю словарь в текстовый файл, он превращает кодовые строки в строки, если это имеет смысл. Поэтому \ u00a1 становится ¡, а \ u00a2 становится * и так далее, и так далее. Я хотел бы написать в точках кода, а не в их строковых представлениях.

Файл, который я пытаюсь обработать, находится здесь: https://storage.googleapis.com/gpt-2/encoder.json

Это код, который я использовал для записи словаря в текстовый файл

import os
import json

with open(r" file/path/to/encoder.json") as f:
   encoder = json.load(f)
   file1 = open(r"file/path/to/file.txt","a", encoding="utf-8")
   for key in encoder:
      file1.write(key + " " + str(encoder[key]) + '\n')

Как написать кодовые точки без их изменения?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

JSON записывает эти escape-коды Unicode, если они записаны с помощью ensure_ascii=True библиотекой json. Он переводит их обратно в кодовые точки Unicode при повторной загрузке файла.

Пример:

>>> s = '\u00a1Hello!' # This is an escape code.  It becomes a single code point in the string.
>>> print(s)
¡Hello!
>>> import json
>>> j = json.dumps(s) # default is ensure_ascii=True
>>> print(j) # Non-ASCII code points are written as escape codes.
"\u00a1Hello!"
>>> s = json.loads(j) # Converts back to code points
>>> print(s)
¡Hello!
>>> s = r'\u00a1Hello!' # a raw string does not process escape code.
>>> print(s)
\u00a1Hello!
>>> j = json.dumps(s) 
>>> print(j) # JSON escapes the backslash so it is written literally to the file.
"\\u00a1Hello!"
>>> s = json.loads(j)
>>> print(s)
\u00a1Hello!

Таким образом, чтобы работать с JSON так, как вам нужно, данные должны быть записаны правильно для начала.

0 голосов
/ 02 апреля 2020

Я нашел файл, который похож на то, на что ссылается OP, если не точно, кодировщик. json.

Глядя в файл, я вижу часть текста упоминается в вопросе OP:

{... "\u00a1": 94, "\u00a2": 95, ...}

И если я запускаю код OP для преобразования encoder.json в file.txt, я вижу эффект «изменения кодовых точек ("\u00a1") в строки (* 1011»). *) ".

Но это не должно быть проблемой, потому что они означают одно и то же:

>>> print("¡ 94\n¢ 95")
¡ 94
¢ 95
>>> print("\u00a1 94\n\u00a2 95")
¡ 94
¢ 95
 >>> "¡ 94\n¢ 95"=="\u00a1 94\n\u00a2 95"
True

То, что символы закодированы как escape-последовательности Юникода в оригинальном JSON file - это всего лишь деталь того, как работает Python кодер JSON (по умолчанию ensure_ascii=True):

>>> json.dumps({"¡": 94, "¢": 95})
'{"\\u00a1": 94, "\\u00a2": 95}'

>>> json.dumps({"¡": 94,"¢": 95}, ensure_ascii=False)
'{"¡": 94, "¢": 95}'

Если вы используете Python2, это всего лишь немного отличается (и может быть более запутанным) с префиксом u"...":

>>> print("¡ 94\n¢ 95")
¡ 94
¢ 95
>>> print(u"\u00a1 94\n\u00a2 95")
¡ 94
¢ 95
>>> u"¡ 94\n¢ 95"==u"\u00a1 94\n\u00a2 95"
True

>>> # But this is the same
>>> json.dumps({"¡": 94, "¢": 95})
'{"\\u00a1": 94, "\\u00a2": 95}'

>>> # But this is a little different
>>> json.dumps({"¡": 94,"¢": 95}, ensure_ascii=False)
'{"\xc2\xa1": 94, "\xc2\xa2": 95}'

>>> # But they !! all **mean** the same thing !!
>>> \
... json.loads('{"\xc2\xa1": 94, "\xc2\xa2": 95}') == \
... json.loads('{"\\u00a1": 94, "\\u00a2": 95}') == \
... json.loads('{"¡": 94, "¢": 95}')
True

На основании того, что я прочитал в этом gpt-2 выпуске :

Код кодера не любит пробелы, поэтому они заменяют пробелы и другие пробельные символы другими байтами Юникода. См. encoder.py для получения подробной информации.

с текстовым файлом, который выглядит следующим образом, вероятно, испортит ваш словарный запас:

...
\u00a1 94
\u00a2 95
...

Была ли у вас реальная проблема с использованием file.txt в вашей цепочке обработки НЛП?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...