当我尝试将单词列表写入txt文件时,我得到TypeError: can't concat str to bytes
。
下面是书上的内容,它返回TypeError
然后我尝试了不同的方式,它的工作原理。
# Error Code
f = open('words.txt', 'w')
for word in stemmed:
try:
f.write(word.encode('utf-8') + '\n')
except UnicodeEncodeError, e:
print 'Enconding error ' + word + '\n'
f.close()
# Working Code
f= open('word.txt','w',encoding= 'utf-8')
for word in stemmed:
try:
f.write(word+'\n')
except UnicodeEncodeError as e:
print('Encoding Error' + word + '\n')
f.close()
两个代码有什么区别?似乎# Working Code
确实将单词列表保存到txt
文件中,但是不打印任何编码错误?
谢谢
似乎第一个片段(书中的那个)是为Python 2编写的。在Python 2中,字节字符串(类型为str
)和Unicode字符串(类型为unicode
)可以混合使用 - 它有时会起作用,有时会引发UnicodeError,有时它会产生垃圾文本(“mojibake”)。
但是,您显然正在运行Python 3(这很好!),其中两种字符串类型不兼容:您不能混合使用字节字符串(类型为bytes
)和Unicode字符串(类型为str
)。
“工作代码”片段看起来很好,不需要改变任何东西(尽管使用with
语句打开文件会很好)。它不会产生任何UnicodeError,因为极少数情况下编码为UTF-8失败。如果有错误,它将由您的except
条款处理。
可能没有必要完全理解为什么第一个代码段失败了。只是抛弃“错误代码”并尝试找到一本更新的Python书籍,其中包含Python 3. Python 2将很快停止使用,如果你是一名新的Python学习者,你不必为此烦恼。
错误代码,代码word.encode()
的结果是像对象一样的字节,所以,你不能连接str和bytes。工作代码:单词和'\ n'在被放入txt文件之前已被编码。