HOWTO · Python

如何在 Python 中使用 cat 命令

通过这份全面的指南,学习如何在 Python 中使用 cat 命令。探索使用 open 函数、pathlib 模块和 subprocess 等方法,高效地读取和操作文件。无论是初学者还是希望提升 Python 文件处理技能的经验丰富的程序员,都非常适合。

本页内容

Python 并不包含 cat 命令。要从 Python 显示文件,请使用 open() 或 pathlib;只有在确实需要那个 Unix 命令时,才用 subprocess 调用外部的 cat 工具。Python 的方法可跨平台工作,并且无需启动另一个进程。

使用 open() 读取并显示文件

将 open() 用作上下文管理器来读取文本文件。本例会自己创建输入文件,因此您可以原样运行。它指定了 UTF-8 编码,with 代码块会在读取后关闭文件。

运行此示例:

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as directory:
    file_path = Path(directory) / "example.txt"
    file_path.write_text("First line.\nSecond line.\n", encoding="utf-8")

    with open(file_path, "r", encoding="utf-8") as file:
        print(file.read(), end="")

对于大文件,应避免将其全部内容读入一个字符串。改为迭代文件,例如使用 for line in file:,并在读取时逐行处理。

使用 pathlib 简洁地读取文件

当整个文本文件可以轻松放入内存时,pathlib.Path.read_text() 是一个简洁的替代方案。与上一个示例一样,本例也会自己创建输入,并明确指定编码。

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as directory:
    file_path = Path(directory) / "example.txt"
    file_path.write_text("First line.\nSecond line.\n", encoding="utf-8")
    print(file_path.read_text(encoding="utf-8"), end="")

这两种方法都会将字节解码为文本。请选择与文件匹配的编码;UTF-8 很常见,但来自其他系统的文件可能使用不同的编码。对于大文件,请使用 open() 并逐行增量处理,而不是加载整个文件。

需要 shell 命令时用 subprocess 运行 cat

如果工作流程特别需要 Unix 的 cat 工具,请使用 subprocess.run() 调用它,并将程序和文件路径作为单独的列表项传递。这样可以避免 shell 对路径进行解析。本例会检查该工具是否已安装,捕获其标准输出和错误,并在命令缺失时进行报告而不会失败。

from pathlib import Path
import shutil
import subprocess
from tempfile import TemporaryDirectory

with TemporaryDirectory() as directory:
    file_path = Path(directory) / "example.txt"
    file_path.write_text("First line.\nSecond line.\n", encoding="utf-8")

    cat_program = shutil.which("cat")
    if cat_program is None:
        print("cat is not available on this system.")
    else:
        result = subprocess.run(
            [cat_program, str(file_path)],
            capture_output=True,
            text=True,
            encoding="utf-8",
            check=False,
        )
        if result.returncode == 0:
            print(result.stdout, end="")
        else:
            print(result.stderr, end="")

这会调用一个外部程序;它并不会使 cat 成为 Python 命令或文件读取 API。这个 Unix 工具通常不会安装在 Windows 上,因此对于可移植的脚本,应优先使用 Python 内置的文件 API。调用任何外部程序时,请保持参数彼此独立,并避免用不受信任的输入构造 shell 命令。示例可能显示的消息保持英文,因为代码块和输出块均保持原样不变。

结论

使用 open() 进行逐行处理或直接读取整个文件;当基于路径的 read_text() 方法能使代码更清晰时,使用 pathlib。只有在确实需要外部 Unix 工具本身时,才通过 subprocess 运行 cat。读取整个文件的方法所用的内存与文件大小成正比;大文件应增量处理。

FAQ

  1. cat 命令是什么?
    它是一个显示或连接文件的 Unix 工具,并未内置于 Python。

  2. 我可以在 Windows 上运行 cat 吗?
    通常默认情况下不可用。Python 的 open() 和 pathlib 提供了可移植的文件读取方式;Windows 也有自己的 shell 命令,但它们不是 Unix 工具。

  3. 我应该使用 subprocess 还是 open() 来读取文件?
    一般的文件访问使用 open() 或 pathlib。当您需要运行 cat 或其他外部程序时,使用 subprocess。

  4. 这些方法能处理大文件吗?
    使用 read() 或 read_text() 读取整个文件会将其内容存储在内存中。对于大文件,请使用 open() 并一次处理一行。