![使用python在文件中批量查找/替换](https://linux22.com/image/1463361/%E4%BD%BF%E7%94%A8python%E5%9C%A8%E6%96%87%E4%BB%B6%E4%B8%AD%E6%89%B9%E9%87%8F%E6%9F%A5%E6%89%BE%2F%E6%9B%BF%E6%8D%A2.png)
我有一个正在编辑的文件,需要更改一些内容。我对 Python 的了解非常基础。如果我能找到解决方案,就可以节省我几个小时的复制/粘贴时间。
我的文件包含以下内容:
002 AS V C 01:00:24:14 01:00:28:18 01:00:35:01 01:00:39:05 * FROM CLIP NAME: Sq3_Sh1.jpg
003 AS V C 01:00:39:05 01:00:42:23 01:00:39:05 01:00:42:23 * FROM CLIP NAME: Sq3_Sh4.jpg
004 AS V C 01:00:42:23 01:00:45:16 01:00:42:23 01:00:45:16 * FROM CLIP NAME: Sq3_Sh5.jpg
005 BA V C 00:00:00:00 00:00:05:20 01:00:45:16 01:00:51:12
006 AS V C 01:00:24:14 01:00:29:06 01:00:51:12 01:00:56:04 * FROM CLIP NAME: Sq3_Sh14.jpg
007 AS V C 01:00:56:04 01:00:59:10 01:00:56:04 01:00:59:10 * FROM CLIP NAME: Sq3_Sh6.jpg
我需要做两件事:
将每个 AS 替换为来自剪辑名称。例如 Sq3_Sh6(不带扩展名)
删除包含 BA 的每一行文本
也许有人可以帮忙?
答案1
有了好的正则表达式工具,事情就变得非常简单了。当然 Python 可以处理这个问题,但是执行文件可以提供更简单的解决方案。它是一个纯脚本实用程序(混合 JScript/批处理),可以在任何 Windows 机器上本地运行。只需将脚本复制到 PATH 中列出的文件夹中即可。
我假设每个文件名的长度小于等于 8 个字符,并且您希望保留每行输出的现有列对齐。
以下解决方案假设您想要覆盖原始文件,将其命名为 test.txt,并且您的 PATH 中列出的文件夹中有 JREPL.BAT。
如果每行都是应该修改和保留的 AS 行,或者是应该删除的 BA 行,那么您所需要的只是以下内容(我使用行延续^
只是为了使代码更易于阅读):
call jrepl "^(... )AS (.*FROM CLIP NAME: (.*?)\..*)$"^
"$1+($3+' ').slice(0,8)+$2"^
/jmatch /f test.txt /o -
如果您的输入包含不应保留的 AS 或 BA 的其他行,那么您可以使用:
call jrepl "^(... )AS (.*FROM CLIP NAME: (.*?)\..*)$|^... (?!BA).*$"^
"$2+($4+' ').slice(0,8)+$3|$0"^
/t "|" /jmatch /f test.txt /o -
完整文档嵌入在JREPL.BAT中。
答案2
在 Windows 下使用 Python 替换行的部分内容
我多么渴望快速的bash
一行1。但是,此脚本应该通过使用简单的正则表达式提取文件名,然后在函数中使用它来执行您想要的操作string.replace()
。
脚本:
#!/usr/bin/env python3
import sys, fileinput, re
if __name__ == "__main__" and len(sys.argv) > 1:
rx = re.compile("(?:FROM CLIP NAME\:\ )([\w]+)\.jpg")
for line in fileinput.input([sys.argv[1]], inplace=True, backup=".bak"):
if not "BA" in line:
if "AS" in line:
m = rx.search(line)
if m:
print(line.replace("AS", m.group(1)))
else:
print(line)
另存为substitution.py
(或其他),然后运行:
D:\project\images\>python substitution.py datafile.dat
其中datafile.dat
是您希望脚本操作的实际文件。脚本将创建名为 的原始文件的备份datafile.dat.bak
。
注意事项和假设
假设您的行以 结尾FROM CLIP NAME: <filename.jpg>
。它假设包含 的行将BA
被省略;并忽略任何不包含“AS”的行。
考虑到这一点而编写python3
,但可以在、和Linux 下python2
测试。2.7.10
Cygwin
2.7.9
3.4.2
可能非常脆弱。使用前请备份文件。不要让脚本进入眼睛。如果误食,请寻求医疗帮助。在加利福尼亚州可能导致癌症。
1甚至可以使用“就地替换”re.sub()
叹
答案3
你可以考虑下面一段代码,只是一个简单的演示,没有处理任何可能的错误。
with open('test.txt', 'rb') as f1:
with open('result.txt', 'a') as f2:
for line in f1:
if 'BA' not in line:
cols = line.split()
clip = line.split(':')[-1].split('.')[0].strip()
if cols[1] == 'AS':
cols[1] = clip
f2.write('{0}\n'.format('\t'.join(cols)))