这个问题已经有一个答案在这里:

我需要确定哪 文件二进制 和这个 文本 在一个目录。

我试图使用 mime类型 但它不是一个很好的想法在我的情况,因为它不能确定所有文件哑剧,我有陌生人在这里...我只是需要知道的二进制或文本。简单吗?但是我不能找到一个解决方案...

感谢

有帮助吗?

解决方案

谢谢大家,我找到一个解决方案,适合我的问题。我发现这个代码 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

其他提示

这是固有的 简单的。有没有办法知道肯定的,虽然可以采取合理地良好的猜测,在大多数情况下。

东西你可能会喜欢做的事:

  • 寻找知道魔术的数字签名的二进制
  • 看Unicode字节以标记在开始的文件
  • 如果文件是定期00xx00xx00xx(任意xx),反之亦然,这是相当可能UTF-16
  • 否则,寻找0s在文件;文件有一个0是 不太可能 将一个单字节的文本编码文件。

但是,它的所有启发式-这是相当可能有一个文件,该文件是一个有效的文本的文件 一个有效的图像文件,例如。它很可能是无稽之谈为文本文件,而合法在一些编码或其他...

它可能可以使用 libmagic 猜MIME类型的文件使用 蟒蛇魔法.如果你回来的东西 "text/*" 名字空间,这可能是一个文本文件,而其他任何东西可能是一个 二进制文件.

如果你的脚本上运行*尼克斯,你可以使用这样的事情:

import subprocess
import re

def is_text(fn):
    msg = subprocess.Popen(["file", fn], stdout=subprocess.PIPE).communicate()[0]
    return re.search('text', msg) != None
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top