如何使用os.walk仅列出文本文件

aqu*_*lin 1 python text-processing

这个问题类似于解决隐藏的文件类型.我正在努力解决类似的问题,因为我只需要处理包含文件的文本,这些文件包含许多不同的文件类型 - 图片,文本,音乐.我正在使用os.walk列出所有内容,包括没有类似扩展名的Icon文件的文件.我正在使用linux,并且只满足于过滤txt文件.一种方法是检查文件扩展名,这篇文章很好地解释了它是如何完成的.

但这仍然留下错误标记的文件或没有扩展名的文件.有十六进制值可以唯一标识称为幻数或文件签名的文件类型.这里这里 不幸的是,文本文件不存在幻数(见这里).

我提出的一个策略是解析第一堆字符,通过字典查找确保它们是单词(我只处理英文文本)然后只进行全文处理,如果这是真的.这个方法似乎相当沉重和昂贵(为每个文件做一堆字典查找).另一种方法是简单地寻找在数据文件中不太常见但在文本文件中常见的单词"the".但是漏报会导致我丢失要处理的文本文件.我试过要求谷歌提供最长的文字而没有"the"这个词,但没有运气.

我不知道这是否是适合这类问题的论坛 - 这几乎是人工智能而不是计算机科学/编码的问题.它并不像乱码检测那么困难.这些文本可能在语义上或语法上都不正确 - 它们可能只是像库房的库存那样的文字,但也可能是散文和诗歌.我只是不想处理可能是字节代码,源代码或不是英文单词的字母数字字符集的文件.

Sum*_*mit 5

您可以使用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))
Run Code Online (Sandbox Code Playgroud)

更新:由于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)
Run Code Online (Sandbox Code Playgroud)

更新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)
Run Code Online (Sandbox Code Playgroud)

如果这些中的任何一个适合您,请告诉我.