【问题标题】:wrong utf-8 characters when writing to file (python)写入文件时错误的 utf-8 字符(python)
【发布时间】:2016-03-04 14:26:59
【问题描述】:

我遇到的编码问题似乎与这里的其他问题非常相似,但并不完全相同,我无法弄清楚这一切。

我以为我已经掌握了编码的概念,但是我有这些特殊字符(æ、ø、å、ö 等)在打印时看起来不错,但无法写入文件。 (例如,当我写入文件时,æ 变为 Ê)

我的代码如下:

def sortWords(subject, articles, stopWordsFile):
    stopWords = [] 
    f = open(stopWordsFile)
    for lines in f:
        stopWords.append(lines.split(None, 1)[0].lower())

    for x in range(0,len(articles)):
        f = open(articles[x], 'r')
        article = f.read().lower()
        article = re.sub("[^a-zA-Z\æøåÆØÅöÖüÜ\ ]+", " ", article)
        article = [word for word in article.split() if word not in stopWords]
        print ' '.join(article)
        w = codecs.open(subject+str(x)+'.txt', 'w+')
        w.write(' '.join(article))



sortWords("hpv", ["vaccine_texts/hpv1.txt"], "stopwords.txt")

我尝试了各种编码,使用 codecs.open(file, r, 'utf-8') 打开文件,但无济于事。我在这里错过了什么?

我在 ubuntu 上(从 Windows 切换,因为它的终端无法正确输出)

【问题讨论】:

  • @JoeDoherty 我看过这个,我写的时候不能使用.encode('utf8'),因为它给了我一个错误。无论我用什么打开文件,它都会显示奇怪的符号(sublime、gedit、vim、记事本)。为什么会发生这种情况?
  • 我打开的一个文件的编码似乎有问题。我尝试了两个单独的文件,其中一个运行良好。我尝试将该文件的内容复制并粘贴到一个新的文本文件中,然后它就起作用了。奇怪

标签: python encoding utf-8


【解决方案1】:

当您在文本文件中看到类似 Ê(或更一般的 2 个字符,其中第一个是 Ã)时,很可能该文件以 UTF8 正确写入,并且编辑器(或屏幕)没有处理正确的 UTF8。

让我们看看æ。它是 unicode 字符 U+E6。当您将其编码为 utf8 时,它会给出两个字符 b'\xc3\xa6',当解码为 latin1 时,它会打印 f 'æ'

你能做些什么来确认?使用出色的 vim 编辑器,它知道多种编码和其他 utf8,至少在您使用其图形界面 gvim 时是这样。

还有一个一般性建议:永远不要在 python 源文件中写入非 ascii 字符,除非您将 # -*- coding: ... -*- 行作为第一行(或者第二行,如果第一行是 hashbang 则 #! /usr/bin/env python )

如果你想在 Windows 下通过 Python 使用 unicode,请使用本机处理它的 IDLE。

TL/DR:如果您使用的是 Linux,很可能您的系统本身配置为使用 utf8 编码,并且您在 utf8 中正确编写了文本文件,但您的文本编辑器无法正确显示 utf8

【讨论】:

  • 谢谢,我认为这是我认为我需要的明确答案。我确实在某个时候尝试过 vim(因为它客观上是最好的编辑器),但是唉!仍然奇怪的字母。我的所有编码/解码实验一定搞砸了。现在一切正常,问题是我从中读取的源文件。非常感谢大家!
【解决方案2】:

你试过了吗:

w.write( ' '.join(article).encode('utf8') )

别忘了关闭你的文件(最好使用with 上下文管理器来操作文件)

【讨论】:

  • 我试过这个,它给了我UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 66: ordinal not in range(128) 错误
  • type( ' '.join(article) ) 、str 还是 unicode 属于什么类型?
  • type(' '.join(article)) 返回 字符串
  • 对我来说它工作得很好:str_u = "æøåÆØÅöÖüÜ", with open("myFile.txt") as myF: myF.write(str_u) 为什么你需要使用编解码器
  • 我打开的一个文件的编码似乎有问题。我尝试了两个单独的文件,其中一个完美无缺。我尝试将该文件的内容复制并粘贴到一个新的文本文件中,然后它就起作用了。奇怪的。在此之前我什至尝试用不同的编解码器打开坏文件,但它不会让我
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2010-10-30
  • 2014-04-06
  • 1970-01-01
相关资源
最近更新 更多