+
85
-

回答

3中方式:

使用 python-magic 检测文件类型
import magic

def is_text_file(filepath):
    """
    使用 `python-magic` 检测文件是否为文本文件。

    :param filepath: 文件路径
    :return: 如果是文本文件返回 True,否则返回 False
    """
    # 获取文件的MIME类型
    mime = magic.Magic(mime=True)
    file_type = mime.from_file(filepath)

    # 检查MIME类型是否以 text/ 开头,或是否为常见的文本类型
    return (file_type.startswith('text/') or
            file_type in ['application/json', 'application/javascript',
                          'application/xml', 'application/x-yaml'])
2、使用启发式方法检测文件内容
def is_text_file(filepath, block_size=512):
    """
    使用启发式方法检测文件是否为文本文件。

    :param filepath: 文件路径
    :param block_size: 读取的块大小,默认为 512 字节
    :return: 如果是文本文件返回 True,否则返回 False
    """
    try:
        with open(filepath, 'rb') as f:
            block = f.read(block_size)
            # 检查是否有空字节(通常表示二进制文件)
            if b'\x00' in block:
                return False

            # 尝试以 UTF-8 解码
            try:
                block.decode('utf-8')
                return True
            except UnicodeDecodeError:
                return False
    except Exception:
        return False
3、基于文件扩展名检测文件类型
def is_text_file(filepath):
    """
    基于文件扩展名检测文件是否为文本文件。

    :param filepath: 文件路径
    :return: 如果是文本文件返回 True,否则返回 False
    """
    # 常见文本文件扩展名列表
    text_extensions = {
        '.txt', '.py', '.js', '.html', '.css', '.json', '.xml',
        '.yaml', '.yml', '.md', '.csv', '.log', '.ini', '.conf',
        '.sh', '.bat', '.ps1', '.java', '.cpp', '.c', '.h',
        '.hpp', '.rs', '.go', '.ts', '.jsx', '.vue'
    }
    return any(filepath.lower().endswith(ext) for ext in text_extensions)
说明

python-magic 方法

使用 python-magic 库检测文件的 MIME 类型。如果 MIME 类型以 text/ 开头,或者属于常见的文本类型(如 JSON、XML 等),则认为是文本文件。

启发式方法

读取文件的前 block_size 字节。检查是否包含空字节(\x00),通常表示二进制文件。尝试将内容解码为 UTF-8,如果成功则认为是文本文件。

文件扩展名方法

检查文件扩展名是否在预定义的文本文件扩展名列表中。简单但不完全可靠,因为文件扩展名可以被更改。注意事项python-magic 方法需要安装 python-magic 库(pip install python-magic)。启发式方法适用于大多数情况,但对于某些特殊文件可能不准确。文件扩展名方法简单但不可靠,适合快速检查。

网友回复

我知道答案,我要回答