首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘’utf 8‘编解码器不能解码字节- Python

‘’utf 8‘编解码器不能解码字节- Python
EN

Stack Overflow用户
提问于 2020-04-05 20:01:44
回答 1查看 2.4K关注 0票数 3

我的Django应用程序同时使用.txt.doc文件类型。这个应用程序打开一个文件,将它与db中的其他文件进行比较,并打印出一些报告。

现在的问题是,当文件类型为.txt时,我会得到'utf-8' codec can't decode byte错误(这里使用的是encoding='utf-8')。当我将encoding='utf-8'切换到encoding='ISO-8859-1'时,错误将更改为'latin-1' codec can't decode byte

我想找到这样的编码格式,它适用于每种类型的文件。--这是我功能的一小部分:

views.py

代码语言:javascript
复制
@login_required(login_url='sign_in')
def result(request):
    last_uploaded = OriginalDocument.objects.latest('id')
    original = open(str(last_uploaded.document), 'r', encoding='utf-8')
    original_words = original.read().lower().split()
    words_count = len(original_words)
    open_original = open(str(last_uploaded.document), "r")
    read_original = open_original.read()
    report_fives = open("static/report_documents/" + str(last_uploaded.student_name) + 
    "-" + str(last_uploaded.document_title) + "-5.txt", 'w')
    # Path to the documents with which original doc is comparing
    path = 'static/other_documents/doc*.txt'
    files = glob.glob(path)

    rows, found_count, fives_count, rounded_percentage_five, percentage_for_chart_five, fives_for_report, founded_docs_for_report = search_by_five(last_uploaded, 5, original_words, report_fives, files)

    context = {
      ...
    }

    return render(request, 'result.html', context)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-05 22:25:43

不存在自动知道如何在特定编码中解码已编码文件的通用编码。

UTF-8是一个很好的选择,与其他编码兼容许多。例如,简单地说,不能像这样解码的ignorereplace字符:

代码语言:javascript
复制
from codecs import open
original = open(str(last_uploaded.document), encoding="utf-8", errors="ignore")
original_words = original.read().lower().split()
...
original.close()

甚至使用上下文管理器(带有语句)为您关闭文件:

代码语言:javascript
复制
with open(str(last_uploaded.document), encoding="utf-8", errors="ignore") as fr:
    original_words = fr.read().lower().split()
    ...

(注意:如果使用Python3,则不需要使用codecs库,但您已经用python-2.7标记了问题。)

您可以看到使用不同的错误处理程序这里这里的优缺点。您必须知道,不使用错误处理程序将默认使用errors="strict",这可能是您不想要的。其他选择可能几乎可以自我解释,例如:

  • 使用errors="replace"将用合适的替换标记替换不可解码的字符。
  • 使用errors="ignore"只会忽略字符并继续读取文件数据。

你应该使用什么取决于你的需求和使用。

您的意思是,您不仅在普通文本文件上存在编码问题,而且在专有doc文件方面也存在编码问题:

.doc格式不是一个纯文本文件,您可以简单地用open()codecs.open()读取它,因为有许多信息以二进制格式存储,有关更多信息,请参见本站。因此,您需要一个专门的.doc文件阅读器来获取文本。您所使用的库取决于您的Python版本,也可能取决于您正在使用的操作系统。也许这里有一个很好的起点给你。

不幸的是,使用库并不能完全防止编码错误。(也许是,但我不确定编码是否保存在文件本身的文件中。)你也可能有机会计算出文件的编码。如何处理编码错误可能取决于库本身。

因此,我猜您正在尝试以简单文本文件的形式打开.doc文件。然后,您将得到解码错误,因为它没有保存为人类可读的文本。即使您消除了错误,您也只会看到非人类可读的文本:(我在LibreOffice in doc-format (Microsoft 1997-2003)创建了一个简单的文本文件):

代码语言:javascript
复制
In [1]: open("./test.doc", "r").read()
UnicodeDecodeError: 'utf-8' codec can`t decode byte 0xd0 in position 0: invalid continuation byte

In [2]: open("./test.doc", "r", errors="replace").read()  # or open("./test.doc", "rb").read()
'��\x11\u0871\x1a�\x00\x00\x00' ...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61048701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档