Abd*_*dir 0 python file-io ascii windows-7
我在 Windows 7 上使用 Python 3.4。我的程序生成一些数字(范围 0-255),然后将它们转换为 ascii 字符 (chr) 并创建一个字符串。现在我想将此字符串的内容保存在文本文件中。它给了我以下错误:
UnicodeEncodeError: 'charmap' codec can't encode character '\x8e' in position 6: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)
请注意,字符串的长度是可变的,任何和所有代码 (0-255) 都可能出现。
示例代码:
file = open('somefiliename.txt', 'w')
file.write(result) #result being the string variable containing ascii chars.
file.close()
Run Code Online (Sandbox Code Playgroud)
我可以打印结果字符串,并且使用 print(result) 没有错误。但它没有保存到文件。
结果 = '' for y in range(4): for x in range(4): result += chr(matrix[x, y]) print(result)
代码很长,我在相关的上面添加了。matrix 是一个 numpy 二维 (4x4) 矩阵,用于存储数字。
我可以在 Windows 7 中使用一个简单的代码来重现这个 -
>>> s = ''
>>> for i in range(256):
... s += chr(i)
...
>>>
>>> f = open('a.txt','w')
>>> f.write(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 129-160: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)
位置 129 的字符从\x81等开始。
出现此问题是因为您使用默认编码打开文件,如果您真的想将这些字符写入文件,则应使用utf8encoding打开它,同时指定换行参数''(为什么?下面解释)。例子 -
>>> f = open('a.txt','w',encoding="utf8",newline='')
>>> f.write(s)
257
>>> f.close()
Run Code Online (Sandbox Code Playgroud)
对于使用 Python 2.x 的用户,他们可以使用codecs.open()特定编码打开文件。
同样对于 Python 3.x ,您在回读此文件时会遇到问题,因为在回读时您会看到 ASCII 值 13 - (Carriage return - '\r') 已转换为'\n') 。这是因为在 Python 3.x 中,如果我们没有为open()function指定换行参数(这意味着它是 None),它将使用通用换行符(将所有 - \r\n、\r、 、转换\n为\n)。从文档-
newline 控制通用换行符的工作方式(它仅适用于文本模式)。它可以是 None、''、'\n'、'\r' 和 '\r\n'。它的工作原理如下:
在输入时,如果换行符为 None,则启用通用换行符模式。输入中的行可以以 '\n'、'\r' 或 '\r\n' 结尾,这些在返回给调用者之前会被转换为 '\n'。如果是 '',则启用通用换行符模式,但行尾会返回给调用者未翻译。如果它具有任何其他合法值,则输入行仅由给定的字符串终止,并且行尾未翻译地返回给调用者。
在输出时,如果换行符为 None,则写入的任何 '\n' 字符都将转换为系统默认行分隔符 os.linesep。如果换行符是 '',则不进行翻译。如果换行符是任何其他合法值,则写入的任何 '\n' 字符都将转换为给定的字符串。
在您的情况下,您应该newline=''在写入和读取文件时指定参数。
阅读示例——
>>> f= open('b.txt','r',newline='',encoding='utf8')
>>> x = f.read()
>>> print(x)
Run Code Online (Sandbox Code Playgroud)