使用Python编写的脚本,从一个
.txt
文件中批量获取你想要的内容。例如:批量提取文本中,当某一行存在 “×××××” 时获取这一行文字,并将所有提取的内容按顺序保存到一个新的文件中。注意:运行脚本需要安装Python运行环境,安装包大小只有30M左右,很轻量。直接在Python官网下载即可:https://www.python.org
1、创建、编写脚本
在桌面新建一个文本文件,在用记事本打开后,复制填入以下这段代码后保存,文件名自定义,将后缀名从 “ .txt ” 改为 “ .py ” 后即完成第一步。我这里演示文件名为“ extract.py ”。
def extract_content_after_marker(input_file, output_file, marker):
# 读取输入文件
with open(input_file, 'r', encoding='utf-8') as file:
lines = file.readlines()
extracted_content = []
# 遍历每一行
for i in range(len(lines)):
if marker in lines[i]: # 检查是否包含需要查找的内容
extracted_content.append(lines[i]) # 添加到输出列表
# 将提取的内容写入新的文件
with open(output_file, 'w', encoding='utf-8') as file:
file.writelines(extracted_content)
input_file = "E:\\UE5\\TestC\\Saved\\Logs\\TestC.log" # "填写被提取的文件名"
output_file = "提取后的文件.txt" # "填写提取后输出文件名"
marker = "Couldn't find file for package" # "填写需要查找的内容"
extract_content_after_marker(input_file, output_file, marker)
2、设置提取文件、内容
input_file = "E:\\UE5\\TestC\\Saved\\Logs\\TestC.log" # "填写被提取的文件名"
output_file = "提取后的文件.txt" # "填写提取后输出文件名"
marker = "Couldn't find file for package" # "填写需要查找的内容"
- 为变量 input_file 填入想要去提取的那个文件的完整路径。我这里以UE5游戏开发项目的日志为例,我想要提取游戏在运行时特定的报错日志,可能有人注意到路径有双反斜杠 \\ ,我是为避免转义字符问题。我电脑UE5项目运行后,日志存放的完整路径为“E:\\UE5\\TestC\\Saved\\Logs\\TestC.log”。若不想填完整路径,也可以将此脚本放在与想要去提取文件的同目录中,然后将原路径字符串替换为文件名"TestC.log",即:
input_file = "TestC.log" # "填写被提取的文件名"
- 为变量 output_file 填入输出的文件名称。即把获取到的所有内容放在什么位置,方便以后查看该文件。我这里是在获取到UE5日志后,把想要提取的内容直接放在脚本同目录中。即:
output_file = "提取后的文件.txt" # "填写提取后输出文件名"
- 为 变量 marker 填入匹配内容。我这里想要获取所有在UE5游戏打包后,筛选其中出现资产丢失时所标记的位置,这样可以帮助我快速统计所有未打包的内容,非常方便。即:
marker = "Couldn't find file for package" # "填写需要查找的内容"
3、执行脚本
在填写完这些必要的路径和查找内容后,保存文件,记得文件后缀名要改为 “ .py ” 格式,我这里演示文件名为“ extract.py ”。在保存关闭后,可直接双击执行脚本。
若你不能这么执行,也可以用控制台命令去执行:新建文件后缀名改为 .bat 后,填入以下命令,保存执行。执行时会打开控制台弹窗,若没有报错则只会显示:“请按任意键继续. . .” 的字样。若存在报错,则会显示具体原因,大多为路径指定错误的问题。
@echo off
python extract.py
pause
4、以此类推
我们在使用这类脚本时,可以扩展到更多需求上,我们可以通过改变筛选规则来能实现不多的功能。我们例子的需求:“当文本某一行包含了 “×××××” 时,提取该行文字” , 在上面脚本中起到匹配和筛选作用的是这三行Python代码,如下:
# 遍历每一行
for i in range(len(lines)):
if marker in lines[i]: # 检查是否包含需要查找的内容
extracted_content.append(lines[i]) # 添加到输出列表
经过这几天的学习发现,上面这三行代码也可用推导式进行简化为一行,即:
#extracted_content = []
# # 遍历每一行
# for i in range(len(lines)):
# if marker in lines[i]: # 检查是否包含需要查找的内容
# extracted_content.append(lines[i]) # 添加到输出列表
extracted_content = [ i for i in lines if marker in i ]
以此类推,比如,我想要提取包含 “×××××” 这一行中,在 “×××××” 后面的内容,而不是提取一整行。我们可以对脚本进行一点点修改,将上面三行代码修改为:
# 遍历每一行
for line in lines:
if marker in line: # 检查是否包含标记字符串
# 提取标记字符串后面的内容
content = line.split(marker, 1)[1].strip()
if content: # 确保提取的内容不是空字符串
extracted_content.append(content + '\n') # 添加到列表,并保留换行符
以此类推,比如,我想要提取所有标记为 “×××××” 的下一行内容,而非当前标记行,则:
# 遍历每一行
for i in range(len(lines)):
if lines[i].strip() == marker: # 检查是否为标记行
if i + 1 < len(lines): # 确保不会超出索引范围
extracted_lines.append(lines[i + 1]) # 添加下一行到列表