This问题与解决隐藏文件类型类似。我正在努力解决类似的问题,因为我只需要处理包含许多不同文件类型(图片、文本、音乐)的文件夹中的文件的文本。我正在使用 os.walk,它列出了所有内容,包括没有扩展名的文件,如图标文件。我使用的是 linux,只过滤 txt 文件会很满意。一种方法是检查文件扩展名和 this帖子很好地解释了它是如何完成的。
但这仍然会留下错误标记的文件或没有扩展名的文件。有十六进制值可以唯一标识文件类型,称为魔数(Magic Number)或文件签名。 here和 here不幸的是,文本文件不存在魔数(Magic Number) (see here)。
我想出的一个策略是通过字典查找来解析第一串字符以确保它们是单词(我只处理英文文本)然后只进行全文处理,如果是的话true.This approach seems quite heavy and expensive(为每个文件做一堆字典查找)。另一种方法是简单地查找在数据文件中不太常见但在文本文件中很常见的词“the”。但是漏报会导致我丢失要处理的文本文件。我试着向谷歌询问最长的没有“the”这个词的文本,但没有成功。
我不知道这是否是提出此类问题的合适论坛 - 这几乎是一个人工智能问题,而不是计算机科学/编码问题。它不像乱码检测那么困难。这些文本在语义或句法上可能不正确——它们可能只是像仓库库存那样的单词,但也可能是散文和诗歌。我只是不想处理可能是字节码、源代码或不是英语单词的字母数字字符集合的文件。
请您参考如下方法:
您可以使用 Python 的 mimetypes 库来检查文件是否为纯文本文件。
import os
import mimetypes
for dirpath, dirnames, filenames in os.walk('/path/to/directory'):
for filename in filenames:
if mimetypes.guess_type(filename)[0] == 'text/plain':
print(os.path.join(dirpath, filename))
更新:由于 mimetypes 库使用文件扩展名来确定文件类型,因此它不是很可靠,尤其是您提到某些文件被错误标记或没有标记扩展名。
对于这些情况,您可以使用 magic库(不幸的是,它不在标准库中)。
import os
import magic
mime = magic.Magic(mime=True)
for dirpath, dirnames, filenames in os.walk('/path/to/directory'):
for filename in filenames:
fullpath = os.path.join(dirpath, filename)
if mime.from_file(fullpath) == 'text/plain':
print(fullpath)
更新 2:上述解决方案不会捕获您认为是“纯文本”的文件(例如 XML 文件、源文件等)。以下解决方案应该适用于这些情况:
import os
import magic
for dirpath, dirnames, filenames in os.walk('/path/to/directory'):
for filename in filenames:
fullpath = os.path.join(dirpath, filename)
if 'text' in magic.from_file(fullpath):
print(fullpath)
让我知道这些是否适合您。
