Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将代码点写入文件而不将其转换为字符串?_Python_Python 3.x_Unicode - Fatal编程技术网

Python 如何将代码点写入文件而不将其转换为字符串?

Python 如何将代码点写入文件而不将其转换为字符串?,python,python-3.x,unicode,Python,Python 3.x,Unicode,我有一个JSON文件,里面有各种各样的字符。我正在用它做一个NLP项目。我需要将文本加载到字典中,然后将密钥按原样写入另一个文件,以便进行额外的预处理。所讨论的文本是数字、字母字符和代码点的混合体。问题是,当我将字典写入文本文件时,如果有意义,它会将代码点更改为字符串。因此\u00a1变成和\u00a2变成、等等。我想写代码点,而不是它们的字符串表示 我正在尝试处理的文件如下: 这是我用来将字典写入文本文件的代码 import os import json with open(r" file/

我有一个JSON文件,里面有各种各样的字符。我正在用它做一个NLP项目。我需要将文本加载到字典中,然后将密钥按原样写入另一个文件,以便进行额外的预处理。所讨论的文本是数字、字母字符和代码点的混合体。问题是,当我将字典写入文本文件时,如果有意义,它会将代码点更改为字符串。因此\u00a1变成\u00a2变成等等。我想写代码点,而不是它们的字符串表示

我正在尝试处理的文件如下:

这是我用来将字典写入文本文件的代码

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除非您担心安全问题,而且数据不可信。请阅读下面的大警告。