Python 写入文件时,是什么导致了这种垃圾

Python 写入文件时,是什么导致了这种垃圾,python,unicode,encoding,Python,Unicode,Encoding,我试图弄清楚在这种情况下发生了什么。我使用的是64位Windows 7,我在Python中试验Unicode 使用以下Python代码 #aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa #aaaaaa x = [u'\xa3'] f = open('file_garbage.txt', 'w+') for s in x: if s in f.read(): continue else: f.write(s.

我试图弄清楚在这种情况下发生了什么。我使用的是64位Windows 7,我在Python中试验Unicode

使用以下Python代码

#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
#aaaaaa

x = [u'\xa3']

f = open('file_garbage.txt', 'w+')
for s in x:
    if s in f.read():
        continue
    else:
        f.write(s.encode('utf-8'))
f.close()
我没有收到错误消息,并且文件\u garbage.txt包含

£
当我向x添加另一项时,如下所示

#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
#aaaaaa

x = [u'\xa3',
     u'\xa3']

f = open('file_garbage.txt', 'w+')
for s in x:
    if s in f.read():
        continue
    else:
        f.write(s.encode('utf-8'))
f.close()
我有一个独角兽

Traceback (most recent call last):
  File "file_garbage.py", line 9, in <module>
    if s in f.read():
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 2: ordinal not in range(128)
像这样的垃圾

£Kà¦éaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
#aaaaaa

x = [u'\xa3',
     u'\xa3']

f = open('file_garbage.txt', 'w+')
for s in x:
    if s in f.read():
        continue
    else:
        f.write(s.encode('utf-8'))
f.close()
 Python Character Mapping Codec cp1252 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT' with gencodec.py.

iÿÿÿÿNt
然后是一组ENQ、DC2、SOH、STX、NUL符号和链接:

 C:\Python27\lib\encodings\cp1252.py
垃圾图片:

我猜这与编码和/或我处理文件的方式有关,但我不清楚到底发生了什么,以及为什么结果似乎不同

垃圾似乎只有在文件顶部那些看似随机的注释字符串组合时才会生成,但字节总是以其他方式生成

如果有帮助,我的系统编码设置如下:

sys.stdout.encoding            :  cp850
sys.stdout.isatty()            :  True
locale.getpreferredencoding()  :  cp1252
sys.getfilesystemencoding()    :  mbcs

文件可能已损坏,因为它未正确关闭。我从未见过这种特殊的行为,但这是可能的。尝试将代码更改为与一起使用

with open('file_garbage.txt', 'w+') as f:
    # do your stuff here
这将确保即使引发异常,文件也已关闭

异常的原因是
x
包含unicode字符串,但当您在
f
中读取时,您读取的是字节。当您尝试在f.read()
中检查
s时,它会尝试将unicode字符串与文件中的字节进行比较,但由于无法将文件中的字节解释为unicode而失败。您需要将文件内容解码回unicode


您的代码还存在一些其他问题,这些问题有些超出了这个问题的范围。对于初学者来说,在这样的循环中使用
f.read()
是行不通的,因为第一次读取将读取整个文件,后续读取将不返回任何内容。相反,首先将文件读入(并解码)一个变量,然后与该变量进行比较。另外,我不确定在
w+
模式下读写文件是否能满足您的需要。(实际上我不确定您希望代码做什么。)因为,
w+
会截断文件,所以您无法通过添加到已有文件中来“更新”它。

您是否正在尝试写入运行代码的同一文件?您的示例看起来像是说垃圾在
文件\u garbage.py
中,但您的代码显示您打开了一个名为
文件\u garbage.txt
的文件。不,我正试图从
文件\u garbage.py
中写入一个名为
文件\u garbage.txt
的单独文本文件,我只是将这两个文件命名为文件\u garbage进行测试,很抱歉造成混淆,因此您正在尝试写入
文件\u garbage.txt
,但实际上正在修改
文件\u garbage.py
?请尝试删除
.encode('utf-8')
,您不会以二进制文件形式打开该文件,所以你应该给它传递一个字符串,而不是字节数组,它将负责编码。@BrenBarn我尝试将文件名
file_garbage.txt
更改为完全不同的内容,但我仍然在新的.txt文件中使用
with
并存储解码的
f.read()
在变量中,然后对照变量进行检查确实解决了问题。在本例中,我只是暂时使用
w+
来测试垃圾输出,之前我使用
a+
读取并附加到文件中。非常感谢你消除了我的困惑。
with open('file_garbage.txt', 'w+') as f:
    # do your stuff here