返回

反转文本文件:Python & Linux 解决方案 | 独立输出

python

反转所有文本文件内容并独立输出

处理大量文本文件时,一个常见需求是将每个文件内容反转并保存到单独的输出文件中。原始脚本虽然实现了文本反转,但所有反转结果都被写入到了同一个 output.txt 文件,这明显不是理想的解决方案。目标是修改现有流程,确保每个输入文件都对应一个独立的输出文件,提升输出的可读性和管理效率。

问题分析

核心问题在于输出文件的管理方式。原脚本使用 echo ... >> output.txt 命令,始终追加内容到名为 output.txt 的文件,导致所有输出混杂在一起。要解决这个问题,必须根据输入文件的名称动态生成输出文件名,实现一对一的文件映射。

解决方案:使用 Python 文件操作

Python 强大的文件处理能力能够轻松实现此需求。采用 open 函数以写入模式(w)打开输出文件,每个输入文件创建一个专属的输出文件。同时,可以优化原脚本的代码,避免不必要的重复读取。

代码示例:

import os

path = '/txt_files_path/' # 文本文件路径

for filename in filter(lambda p: p.endswith(".txt"), os.listdir(path)):
    filepath = os.path.join(path, filename)
    output_filename = filename.replace(".txt", "_reversed.txt") # 生成输出文件名
    output_filepath = os.path.join(path, output_filename)  # 生成输出文件路径

    with open(filepath, 'r') as infile, open(output_filepath, 'w') as outfile: #使用with处理文件读写
        for line in infile:
            reversed_line = line.rstrip()[::-1]  # 反转行并移除尾部换行符
            outfile.write(reversed_line + "\n") #写入反转后的内容,增加换行符

操作步骤:

  1. 将上述 Python 代码保存为一个 .py 文件 (例如: reverse_files.py)。
  2. 修改代码中 /txt_files_path/ 为你的文本文件实际存放路径。
  3. 运行脚本: python reverse_files.py

此脚本逐个遍历目录下的 txt 文件,读取内容,反转每行文字,并以 _reversed.txt 为后缀命名生成对应的反转文件。 文件操作使用with语句自动管理资源,确保文件在使用后被正确关闭,增加了安全性,也使代码更为简洁。 输出文件与原文件在相同路径, 易于查找和管理。

解决方案:使用 sedfind 命令

如果倾向于使用命令行工具,也可以通过 findsed 命令组合完成。 find 用于查找目标 txt 文件,sed 则用于反转每行内容。

命令示例:

find /txt_files_path/ -type f -name "*.txt" -exec sh -c 'sed -e "s/\(.*\)/\1\n/" | tac | sed "s/.$//;" > "${0%.txt}_reversed.txt"' {} \;

操作步骤:

  1. /txt_files_path/ 替换为你的文本文件路径。
  2. 复制上述命令并粘贴到终端中执行。

此命令组合运行原理复杂, 需要进一步说明: find 命令用于查找符合 *.txt 文件; -exec 后面是用 sh -c 执行命令,每个匹配文件都执行一次sh -c 中的命令;sed -e "s/\(.*\)/\1\n/" 在每一行后面增加一个换行;tac 命令将文件反序输出, 达到行的反序输出效果, 反序后行的结尾会多出一个换行; 最后一个sed "s/.$//;" 命令,删除每一行的结尾换行; "${0%.txt}_reversed.txt" 生成输出文件。 sh -c 中的 {} 代表匹配到的文件名,而${0%.txt}的作用是将文件后缀 .txt移除, 最后拼接 _reversed.txt生成对应的输出文件名。 优点是可以利用命令行管道操作,处理文件更为快速。

安全建议:

  • 在处理重要文件前,建议备份数据。
  • 注意输入路径中是否存在特殊字符,防止命令注入。
  • 在实际生产环境运行命令之前,建议使用 -print 参数进行预览,例如 find /txt_files_path/ -type f -name "*.txt" -print,确认操作文件范围正确。

资源链接:
python文件操作文档
Linux find命令教程
Linux sed命令教程