我的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
@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)发布于 2020-04-05 22:25:43
不存在自动知道如何在特定编码中解码已编码文件的通用编码。
UTF-8是一个很好的选择,与其他编码兼容许多。例如,简单地说,不能像这样解码的ignore或replace字符:
from codecs import open
original = open(str(last_uploaded.document), encoding="utf-8", errors="ignore")
original_words = original.read().lower().split()
...
original.close()甚至使用上下文管理器(带有语句)为您关闭文件:
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)创建了一个简单的文本文件):
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' ...https://stackoverflow.com/questions/61048701
复制相似问题