【问题标题】:python 3 - UnicodeEncodeError: 'charmap' codec can't encode character (Encode so it's in a file)python 3 - UnicodeEncodeError:'charmap'编解码器无法编码字符(编码使其在文件中)
【发布时间】:2018-09-16 06:38:51
【问题描述】:

我目前正在尝试获取某个帐户的推文并将它们以特定格式写入文件,但有时该帐户会在编解码器之外使用表情符号和其他字符,因此在阅读推文时,Python 会发疯并给我以下错误(它不喜欢的特定字符是希腊字母“χ”,如果这有任何帮助,尽管我需要一个可以处理 Python 不喜欢的任何字符的修复程序):

UnicodeEncodeError: 'charmap' codec can't encode character '\u03c7' in position 4: character maps to <undefined>

我尝试将.encode("utf-8") 添加到字符串的末尾,但最终将原始文本数据写入文件,而我实际上需要将单词写入不同的行。这是我到目前为止的代码(代码本身可以工作,因为它读取数据并将其放入我需要的格式,所以我不需要帮助,只需要写入文件部分。):

    with open("LSData.txt", "a") as file:
        for status in tl:
            wordList = status.full_text.split(" ")
            for word in wordList:

                try:
                    if("http" not in word):
                        if(word == wordList[0] or
                           wordList[wordNum-1][len(wordList[wordNum-1])-1] == "." or
                           wordList[wordNum-1][len(wordList[wordNum-1])-1] == "!" or
                           wordList[wordNum-1][len(wordList[wordNum-1])-1] == "?"):

                            wordsToAdd = "-"  + word + " " + wordList[wordNum+1] + "\n"
                            file.write(wordsToAdd)

                        else:
                            wordsToAdd = word + " " + wordList[wordNum+1] + "\n"
                            file.write(wordsToAdd)



                except(IndexError):
                    pass

                wordNum += 1

如果我需要提供更多信息,请告诉我。提前致谢!

【问题讨论】:

  • 是windows机器吗?

标签: python python-3.x unicode encoding


【解决方案1】:

简短的回答:

您需要使用 UTF-8 编码打开文件。

    with open("LSData.txt", "a", encoding="utf-8") as file:

长答案:

当 Python 尝试将字符写入文件时会生成您看到的错误,但您打开文件时使用的编码不支持该字符。

在上面的代码中,当您使用open 时,您没有指定编码,在这种情况下,Python 将使用您的语言环境的默认编码。这因系统而异,您系统的默认语言环境似乎不支持希腊字母“χ”。

要解决此问题,您需要在打开文件时指定编码,并且您使用的编码需要支持您要写入的所有字符。这通常意味着使用其中一种 Unicode 编码,最常见的 Unicode 编码是 UTF-8。如果您可以选择应该使用什么编码,那么现在最好的做法是在打开文件时使用 UTF-8。

如果您想详细了解编码的工作原理以及发生此类问题的原因,this blog post 是一个不错的起点。

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 2018-08-25
    相关资源
    最近更新 更多