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

2024-05-23 22:16:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我试过使用mimetypes,但对我来说这不是个好主意,因为它无法识别所有文件的mime,而且我这里有陌生人的mime。。。我只需要知道,二进制或文本。简单吗?但我找不到解决办法。。。

谢谢


Tags: 文件文本目录二进制主意mimemimetypes陌生人
3条回答

可以使用libmagic来猜测使用python-magic的文件的MIME类型。如果您在"text/*"名称空间中返回了某个内容,则它可能是文本文件,而其他内容可能是binary file

它本质上是而不是简单的。虽然在大多数情况下你都能做出相当好的猜测,但无法确定。

你可能想做的事情:

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

但这都是启发性的——例如,很有可能有一个有效的文本文件的有效图像文件。作为一个文本文件,这可能是无稽之谈,但在某些编码或其他方面是合法的。。。

谢谢大家,我找到了一个适合我的问题的解决方案。我在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

相关问题 更多 >