为什么python用乱码字符写入文件

时间:2013-06-27 15:48:09

标签: python character-encoding

我在项目euler尝试了Problem 10并且通过但是我决定,如果我将200万以下的所有素数用于文本(.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

2 个答案:

答案 0 :(得分:11)

这是Microsoft记事本程序中的错误,而不是您的代码中的错误。

>>> 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 :(得分:1)

试试这个:

txt.write('%i ' % next_prime)

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