2010-03-18 145 views
4

我有一个文件夹已满,我想搜索一些内部的字符串。问题是,某些文件可能是zip,exe,ogg等。 我可以检查它是什么类型的文件,所以我只打开并通过txt,PHP等文件进行搜索。 我不能依赖文件扩展名。如何检查文件是否包含纯文本?

+1

你可以直接调用'file'吗?它涵盖了很多类型。 http://linux.die.net/man/1/file – 2010-03-18 17:59:00

回答

3

您可以使用Python interfacelibmagic来识别文件格式。

>>> import magic 
>>> f = magic.Magic(mime=True) 
>>> f.from_file('testdata/test.txt') 
'text/plain' 

更多示例请参见repo

0

如果你在linux上,你可以解析file命令行工具的输出。

5

使用Python的mimetypes库:

import mimetypes 
if mimetypes.guess_type('full path to document here')[0] == 'text/plain': 
    # file is plaintext 
+3

mimetypes使用文件的filename.ext来确定文件内容。通过重命名文件很容易欺骗。在* nix系统中使用“file”命令更安全,因为它在文件内部查看内容的外观。 “文件”也可能被欺骗,但至少它会查看内容。像下面的思南提到的蟒蛇魔法会更安全。欲了解更多信息,请在* nix上做一个“man file”和“man magic”。 – 2010-03-18 19:29:25

+3

有趣的是,OP明确表示他不能依赖文件扩展名,然后标记正确的答案,只查看文件扩展名... – 2010-03-18 22:26:12

1

尝试这样的事:

def is_binay_file(filepathname): 
    textchars = bytearray([7,8,9,10,12,13,27]) + bytearray(range(0x20, 0x7f)) + bytearray(range(0x80, 0x100)) 
    is_binary_string = lambda bytes: bool(bytes.translate(None, textchars)) 

    if is_binary_string(open(filepathname, 'rb').read(1024)): 
     return True 
    else: 
     return False 

使用这样的方法:

is_binay_file('<your file path name>') 

这将返回True,如果文件是二进制如果文本是文字,则输入False - 应该很容易将其转换为反映您的需求fx。使功能is_text_file - 我离开那个由你决定

相关问题