使用python在文件中批量查找/替换

使用python在文件中批量查找/替换

我有一个正在编辑的文件,需要更改一些内容。我对 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

我需要做两件事:

  1. 将每个 AS 替换为来自剪辑名称。例如 Sq3_Sh6(不带扩展名)

  2. 删除包含 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.10Cygwin2.7.93.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)))

相关内容