如何使用Python识别二进制文件和文本文件?

Tho*_*mas 16 python binary text file-type

我需要确定哪个文件二进制文件,哪个文件是目录中的文本.

我试过使用mimetypes,但在我的情况下它不是一个好主意,因为它无法识别所有文件的mimes,我在这里有陌生人...我只需要知道,二进制或文本.简单吗?但我找不到解决方案......

谢谢

Tho*_*mas 11

谢谢大家,我找到了适合我的问题的解决方案.我在http://code.activestate.com/recipes/173220/上找到了这个代码,我改变了一小块以适合我.

它工作正常.

from __future__ import division
import string 

def istext(filename):
    s=open(filename).read(512)
    text_characters = "".join(map(chr, range(32, 127)) + list("\n\r\t\b"))
    _null_trans = string.maketrans("", "")
    if not s:
        # Empty files are considered text
        return True
    if "\0" in s:
        # Files with null bytes are likely binary
        return False
    # Get the non-text characters (maps a character to itself then
    # use the 'remove' option to get rid of the text characters.)
    t = s.translate(_null_trans, text_characters)
    # If more than 30% non-text characters, then
    # this is considered a binary file
    if float(len(t))/float(len(s)) > 0.30:
        return False
    return True
Run Code Online (Sandbox Code Playgroud)

  • 对你的代码进行一点修改:`if float(len(t))/ float(len(s))> 0.30:return 0`否则,python将使用整数除法,并且只有当len(t)时才进行比较)== len(s) (7认同)
  • TypeError:+:'map'和'list'不支持的操作数类型 (4认同)

Jon*_*eet 8

这本质上并不简单.虽然在大多数情况下你可以采取一个相当好的猜测,但没有办法确定.

你可能想做的事情:

  • 在二进制签名中查找已知的幻数
  • 在文件的开头查找Unicode字节顺序标记
  • 如果文件定期为00 xx 00 xx 00 xx(对于任意xx),反之亦然,那很可能是UTF-16
  • 否则,在文件中查找0; 具有0 in的文件不太可能是单字节编码的文本文件.

但它是所有启发式的 - 例如,很可能有一个文件是有效的文本文件有效的图像文件.作为一个文本文件可能是无稽之谈,但在某些编码或其他方面合法......


Aoi*_*ife 5

如果您的脚本在 *nix 上运行,您可以使用以下内容:

import subprocess
import re

def is_text(fn):
    msg = subprocess.Popen(["file", fn], stdout=subprocess.PIPE).communicate()[0]
    return re.search('text', msg) != None
Run Code Online (Sandbox Code Playgroud)

  • 我建议 Popen(["file", "--mime", fn]. ...)。否则“文本”一词可能不会出现。在我的 Linux 上,看起来像 Fortran 程序的答案是“FORTAN 程序”。如果添加 mime 开关,则会得到“text/x-fortran; charset=us-ascii”。 (2认同)

Joh*_*ett 5

可能可以使用libmagic通过python-magic来猜测文件的MIME类型。如果您在“ text / *”命名空间中找到某个内容,则可能是文本文件,而其他内容可能是二进制文件