我有一个包含各种字符的JSON文件。我正在将其用于NLP项目。我需要将文本加载到字典中,然后将密钥原样写入另一个文件中以进行一些额外的预处理。所讨论的文本是数字,字母字符和代码点的组合。问题是,当我将字典写入文本文件时,如果有必要,它将把代码点更改为字符串。因此 \ 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')
如何编写代码点而不更改它们?
答案 0 :(得分:2)
如果ensure_ascii=True
库用json
编写,JSON将写入这些Unicode转义代码。再次加载文件时,会将它们转换回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一起使用,首先需要正确编写数据。
答案 1 :(得分:0)
我找到了一个与OP所指的文件相似的文件,即使不是encoder.json。
在文件中,我可以看到OP问题中引用的一些文本:
{... "\u00a1": 94, "\u00a2": 95, ...}
如果我运行OP的代码将encoder.json
转换为file.txt
,我确实会看到“将代码点("\u00a1"
)转换为字符串("¡"
)的效果”
但是,这应该不成问题,因为它们的含义相同:
>>> print("¡ 94\n¢ 95")
¡ 94
¢ 95
>>> print("\u00a1 94\n\u00a2 95")
¡ 94
¢ 95
>>> "¡ 94\n¢ 95"=="\u00a1 94\n\u00a2 95"
True
在原始JSON文件中将字符编码为unicode转义序列只是关于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 issue中所读的内容:
编码器代码不喜欢空格,因此它们会替换空格和其他 带其他unicode字节的空白字符。参见
encoder.py
详细信息。
拥有一个类似于以下内容的文本文件可能会使您的词汇混乱:
...
\u00a1 94
\u00a2 95
...
您在NLP处理链中使用file.txt
时遇到了实际问题吗?