Python 如何将代码点写入文件而不将其转换为字符串?
我有一个JSON文件,里面有各种各样的字符。我正在用它做一个NLP项目。我需要将文本加载到字典中,然后将密钥按原样写入另一个文件,以便进行额外的预处理。所讨论的文本是数字、字母字符和代码点的混合体。问题是,当我将字典写入文本文件时,如果有意义,它会将代码点更改为字符串。因此\u00a1变成和\u00a2变成、等等。我想写代码点,而不是它们的字符串表示 我正在尝试处理的文件如下: 这是我用来将字典写入文本文件的代码Python 如何将代码点写入文件而不将其转换为字符串?,python,python-3.x,unicode,Python,Python 3.x,Unicode,我有一个JSON文件,里面有各种各样的字符。我正在用它做一个NLP项目。我需要将文本加载到字典中,然后将密钥按原样写入另一个文件,以便进行额外的预处理。所讨论的文本是数字、字母字符和代码点的混合体。问题是,当我将字典写入文本文件时,如果有意义,它会将代码点更改为字符串。因此\u00a1变成和\u00a2变成、等等。我想写代码点,而不是它们的字符串表示 我正在尝试处理的文件如下: 这是我用来将字典写入文本文件的代码 import os import json with open(r" file/
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')
如何在不更改代码点的情况下编写代码点?如果使用
库编写,JSON将写入这些Unicode转义码,请确保JSON
库中的ascii=True
。再次加载文件时,它会将它们转换回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中正常工作,首先需要正确写入数据。JSON在使用
库编写时写入那些Unicode转义码,确保JSON
库将ascii=True
。再次加载文件时,它会将它们转换回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,首先需要正确写入数据。我发现一个与OP所指的文件类似的文件,如果不完全一样的话 查看文件,我可以看到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编码器工作原理的一个细节(其默认值为sure_ascii=True
):
如果您使用的是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
根据我在这篇文章中读到的内容:
编码器代码不喜欢空格,所以它们会替换空格和其他空格
带有其他unicode字节的空白字符。有关详细信息,请参见encoder.py
细节
如果有一个如下所示的文本文件,可能会弄乱您的词汇表:
...
\u00a1 94
\u00a2 95
...
您在NLP处理链中使用
file.txt
时有实际问题吗?我发现一个文件与OP所指的文件类似,如果不完全相同的话
查看文件,我可以看到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编码器工作原理的一个细节(其默认值为sure_ascii=True
):
如果您使用的是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
根据我在这篇文章中读到的内容:
编码器代码不喜欢空格,所以它们会替换空格和其他空格
带有其他unicode字节的空白字符。有关详细信息,请参见encoder.py
细节
如果有一个如下所示的文本文件,可能会弄乱您的词汇表:
...
\u00a1 94
\u00a2 95
...
在NLP处理链中使用
file.txt
是否存在实际问题?您希望代码点像文字字符串一样编写。例如,print(r'\u00a2')
如果是这样,在字符串之前给出字母r,告诉python将其视为原始字符串,而不解释任何特殊含义链接断开,这就是为什么不鼓励使用链接。在问题本身中张贴实际文档的样本。最好的方法是使用酸洗。使用此功能,您可以检索原始数据,无论在文件中存储何种类型的数据,在加载时都会收到相同类型的数据it@GurkiratSingh除非您担心安全问题,而且数据不可信。阅读中的大警告。您希望代码点像文字字符串一样编写。例如,print(r'\u00a2')
如果是这样,在字符串之前给出字母r,告诉python将其视为原始字符串,而不解释任何特殊含义链接断开,这就是为什么不鼓励使用链接。在问题本身中张贴实际文档的样本。最好的方法是使用酸洗。使用此功能,您可以检索原始数据,无论在文件中存储何种类型的数据,在加载时都会收到相同类型的数据it@GurkiratSingh除非您担心安全问题,而且数据不可信。请阅读下面的大警告。