为什么Python写入文件时会出现乱码字符

3

我尝试了project euler的问题10,并通过了,但我想:如果我将2百万以下的所有素数写入文本(.txt)文件怎么办呢?于是我继续修改主函数,它解决了这个问题,所以我不只是把它添加到一个变量(tot)中,而是将由生成器生成的素数写入文本文件。起初它起作用了,但忘记在每个素数后添加空格,所以输出有点像胡言乱语。

357111317192329313741434753

所以我将我的txt.write(str(next_prime))修改为txt.write(str(next_prime) + ' ')

在这个微小的修改之后,输出完全是胡言乱语。

″‵‷ㄱㄠ″㜱ㄠ‹㌲㈠‹ㄳ㌠‷ㄴ㐠″

这是完整的函数代码:

def solve_number_10():
    total = 2
    txt = open("output.txt","w")
    for next_prime in get_primes(3):
        if next_prime < 2000000:
            txt.write(str(next_prime) + ' ')
            #total += next_prime
        else:
            print "Data written to txt file"
            #print total
            txt.close()
            return

为什么会发生这种情况,我该如何使输出结果变得像这样
3 5 7 11 13 17 19

9
你用什么工具来阅读文件?Windows记事本吗?它有一个众所周知的长期未解决的问题,会导致它将某些普通纯文本文件误解为UTF-16编码,从而显示出那些字符类型。参考链接:http://en.wikipedia.org/wiki/Bush_hid_the_facts - Marc B
可能相关:Python 的哪个版本?不过我认为 @MarcB 可能已经发现了问题。 - Henry Keiter
但是忘记在每个质数后添加空格,所以输出有点像胡言乱语——就像你在那个冗长的句子中忘记使用标点符号/大写字母一样? - twalberg
我的意思是“输出”,而不是“out output”,这不是很明显吗?而且与主题无关。 - K DawG
2个回答

11

这是微软记事本程序中的一个错误,而不是您代码中的错误。

>>> a = '‵‷ㄱㄠ″㜱ㄠ‹㌲㈠‹ㄳ㌠‷ㄴ㐠'
>>> a.decode('UTF-8').encode('UTF-16LE')
'5 7 11 13 17 19 23 29 31 37 41 4'

哦,嘿,看,它们是质数(我假设4只是截断的43)。

您可以通过以下方法解决记事本中的错误:

  1. 使用没有该错误的其他文件查看器。

  2. 在文件开头写入一个ZWNBSP,仅编码为UTF-8一次:

    txt.write(u'\uFEFF'.encode('UTF-8'))
    

    这被错误地称为BOM。在UTF-16中它将是BOM,但是在技术上,UTF-8不应该有BOM。大多数程序会忽略它,在其他程序中它也将是无害的。


1

试试这个:

txt.write('%i ' % next_prime)

看起来 str() 将您的数字转换为某种编码中与其匹配的字符,而不是其字符串表示形式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接