我需要识别一个目录中的文件是二进制的还是文本的。
我尝试使用mimetypes,但在我的情况下它并不是一个好办法,因为它不能识别所有文件的mimes,并且我这里有一些奇怪的文件类型... 我只需要知道,二进制还是文本。简单?但我找不到解决方法...
谢谢
我需要识别一个目录中的文件是二进制的还是文本的。
我尝试使用mimetypes,但在我的情况下它并不是一个好办法,因为它不能识别所有文件的mimes,并且我这里有一些奇怪的文件类型... 我只需要知道,二进制还是文本。简单?但我找不到解决方法...
谢谢
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
if float(len(t))/float(len(s)) > 0.30: return 0
否则,Python会使用整数除法,当len(t) == len(s)时,比较结果只会为真。 - Cédric Julienfloat
,因为有from __future__ import division
这一行,是吗? - simon这是固有的不简单。虽然在大多数情况下你可以做一个合理的猜测,但无法确定。
以下是您可能想要执行的操作:
但这全是启发式方法 - 可能存在一个既是有效文本文件,又是图像文件的文件。它可能作为文本文件是无意义的,但在某些编码中是合法的...
如果你的脚本运行在*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
re
。 - Steven Lumsg
将是字节而不是字符串,因此你必须使用return re.search("text", msg.decode()) != None
或者 return "text" in msg.decode()
。 - Matt Pitkin