Ms word doc或docx:是否有安全的方法从';请求';在蟒蛇3中?

Ms word doc或docx:是否有安全的方法从';请求';在蟒蛇3中?,ms-word,python-requests,docx,doc,Ms Word,Python Requests,Docx,Doc,1) 如何区分doc和docx文件与请求 a) 例如,如果我有 url='https://www.iadb.org/Document.cfm?id=36943997' r = requests.get(url,timeout=15) print(r.headers['content-type']) 我明白了: application/vnd.openxmlformats-officedocument.wordprocessingml.document 这个文件是docx b) 如果我有 ur

1) 如何区分doc和docx文件与请求

a) 例如,如果我有

url='https://www.iadb.org/Document.cfm?id=36943997'
r = requests.get(url,timeout=15)
print(r.headers['content-type'])
我明白了:

application/vnd.openxmlformats-officedocument.wordprocessingml.document
这个文件是docx

b) 如果我有

url='https://www.iadb.org/Document.cfm?id=36943972'
r = requests.get(url,timeout=15)
print(r.headers['content-type'])
我明白了

application/msword
这个文件是一个文档

2) 还有其他选择吗


3) 如果我将docx文件另存为doc,或者反之亦然,我可能会有识别问题(例如,转换为pdf?)?有什么最佳做法可以解决这个问题吗?

您得到的mime头似乎是正确的:

然而,发送软件只能根据用户选择的文件进行发送,而且仍然有很多人发送扩展名错误的文件。有些软件可以处理这个问题,而有些则不能。要查看此操作,请将PNG图像的名称改为以JPEG结尾。我只是在我的Mac上做了,Preview仍然可以打开它。当我按下⌘+我在Finder中看到它说它是一个JPEG文件,但在预览中打开时,它会被正确识别为一个“便携式网络图形”文件。(您的操作系统可能无法做到这一点。)

但下载文件后,即使作者的扩展名有误,也可以明确区分DOC和DOCX文件

文档文件以MicrosoftOLE头开始,这是一个相当复杂的结构。另一方面,DOCX文件是一种复合文件格式,包含许多较小的XML文件,使用标准的ZIP文件压缩一起压缩。因此,此文件类型始终以两个字符
PK
开头

此检查与Python 2.7和3.x兼容(只有一个需要
解码
):

导入系统 如果len(sys.argv)==2: 打印('测试文件:'+sys.argv[1]) 将open(sys.argv[1],'rb')作为testMe: startBytes=testMe.read(2).decode('latin1')) 打印(起始字节) 如果startBytes=='PK': 打印('这是DOCX文档') 其他: 打印('这是一个文档')
从技术上讲,对于任何不是以
PK
开头的文件,它都会自信地声明“这是一个DOC文档”,相反,对于任何压缩文件(甚至是恰好以这两个字符开头的纯文本文件),它都会说“这是一个DOCX文档”。因此,如果您根据此决定进一步处理该文件,您可能会发现它毕竟不是Microsoft Word文档。但至少您已经尝试了正确的解码器。

您得到的mime头似乎是正确的:

然而,发送软件只能根据用户选择的文件进行发送,而且仍然有很多人发送扩展名错误的文件。有些软件可以处理这个问题,而有些则不能。要查看此操作,请将PNG图像的名称改为以JPEG结尾。我只是在我的Mac上做了,Preview仍然可以打开它。当我按下⌘+我在Finder中看到它说它是一个JPEG文件,但在预览中打开时,它会被正确识别为一个“便携式网络图形”文件。(您的操作系统可能无法做到这一点。)

但下载文件后,即使作者的扩展名有误,也可以明确区分DOC和DOCX文件

文档文件以MicrosoftOLE头开始,这是一个相当复杂的结构。另一方面,DOCX文件是一种复合文件格式,包含许多较小的XML文件,使用标准的ZIP文件压缩一起压缩。因此,此文件类型始终以两个字符
PK
开头

此检查与Python 2.7和3.x兼容(只有一个需要
解码
):

导入系统 如果len(sys.argv)==2: 打印('测试文件:'+sys.argv[1]) 将open(sys.argv[1],'rb')作为testMe: startBytes=testMe.read(2).decode('latin1')) 打印(起始字节) 如果startBytes=='PK': 打印('这是DOCX文档') 其他: 打印('这是一个文档')
从技术上讲,对于任何不是以
PK
开头的文件,它都会自信地声明“这是一个DOC文档”,相反,对于任何压缩文件(甚至是恰好以这两个字符开头的纯文本文件),它都会说“这是一个DOCX文档”。因此,如果您根据此决定进一步处理该文件,您可能会发现它毕竟不是Microsoft Word文档。但至少你已经试过使用合适的解码器。

你还是要保存文件吗?在这种情况下,请看前两个字节。请注意,它不会告诉您该文档是否确实是有效文档或DOCX;它只会区分这两者。只有当您完全确定它是这两个文件中的一个时,这才有效。@usr2564301是的,如果它是一个doc或docx,但不是一个excel文件,我将下载它。我怎么做到的?我的意思是我必须自动完成!它们有很多文件。你还是要保存文件吗?在这种情况下,请看前两个字节。请注意,它不会告诉您该文档是否确实是有效文档或DOCX;它只会区分这两者。只有当您完全确定它是这两个文件中的一个时,这才有效。@usr2564301是的,如果它是一个doc或docx,但不是一个excel文件,我将下载它。我怎么做到的?我的意思是我必须自动完成!它们有很多文件。