Python 从二进制数据识别不带扩展名的文件的类型

Python 从二进制数据识别不带扩展名的文件的类型,python,file,binaryfiles,binary-data,Python,File,Binaryfiles,Binary Data,我有一些没有扩展名的文件。我想将扩展与它们关联。为此,我编写了一个python程序来读取文件中的数据。我的疑问是,如果不使用第三方工具,如何在没有扩展的情况下识别其类型 我必须确定一个pdf,文档和文本文件只。其他类型的文件是不可能的 我的服务器是cent os你还没有说你的操作系统是什么。如果是基于*nix的,那么libmagic周围有一个python包装器(使用ctypes),它使用与file命令相同的底层机制,该命令可以通过检查内容来识别没有扩展名的文件。或者,只需检查libmagic如何

我有一些没有扩展名的文件。我想将扩展与它们关联。为此,我编写了一个python程序来读取文件中的数据。我的疑问是,如果不使用第三方工具,如何在没有扩展的情况下识别其类型

我必须确定一个pdf,文档和文本文件只。其他类型的文件是不可能的


我的服务器是cent os

你还没有说你的操作系统是什么。如果是基于*nix的,那么libmagic周围有一个python包装器(使用ctypes),它使用与
file
命令相同的底层机制,该命令可以通过检查内容来识别没有扩展名的文件。或者,只需检查libmagic如何使用文件定义,并确定它如何识别两种主要文件类型(doc、pdf),剩下的所有内容都必须是文本;-)并扩展现有代码。

您可以读取文件的前几个字节并查找“幻数”。on魔术数字表明PDF文件以ASCII
%PDF
开头,而doc文件以十六进制D0 CF 11 E0开头


在一般情况下,识别文本文件是相当困难的,因为许多标准幻数实际上是二进制文件开头的ASCII文本。就您的情况而言,如果您可以保证除了PDF、DOC或TXT之外不会得到任何东西,那么您可能会通过检查PDF和DOC幻数,然后假设它是文本(如果不是这两个数字)。

PDF文档以%PDF版本号开始,但是其中一些可以被完全压缩。

在阅读文档时,我得到了这个ÐÏa“,你知道吗?这似乎是十六进制D0 CF 11 E0,被解释为字符串。(注意,DOC文件的神奇数字是原始十六进制字节,而不是字符串。你应该以二进制模式读取文件。)好的,我明白了,我明白了。我需要读取数据并使用ord()将其转换为int,然后再转换为hex,对吗?您需要读取文件的前四个字节。如果以二进制形式读取,则应该能够将这些字节直接与字节字符串
b“\xD0\xCF\x11\xE0”
进行比较。