用Python替换文件中的字符串

用Python替换文件中的字符串,第1张

用Python替换文件中的字符串

将所有这些代码放入一个名为的文件中

mass_replace
。在Linux或Mac OS X下,您可以执行
chmod +xmass_replace
然后运行。在Windows下,您可以运行,
python mass_replace
后跟适当的参数。

#!/usr/bin/pythonimport osimport reimport sys# list of extensions to replaceDEFAULT_REPLACE_EXTENSIONS = None# example: uncomment next line to only replace *.c, *.h, and/or *.txt# DEFAULT_REPLACE_EXTENSIONS = (".c", ".h", ".txt")def try_to_replace(fname, replace_extensions=DEFAULT_REPLACE_EXTENSIONS):    if replace_extensions:        return fname.lower().endswith(replace_extensions)    return Truedef file_replace(fname, pat, s_after):    # first, see if the pattern is even in the file.    with open(fname) as f:        if not any(re.search(pat, line) for line in f): return # pattern does not occur in file so we are done.    # pattern is in the file, so perform replace operation.    with open(fname) as f:        out_fname = fname + ".tmp"        out = open(out_fname, "w")        for line in f: out.write(re.sub(pat, s_after, line))        out.close()        os.rename(out_fname, fname)def mass_replace(dir_name, s_before, s_after, replace_extensions=DEFAULT_REPLACE_EXTENSIONS):    pat = re.compile(s_before)    for dirpath, dirnames, filenames in os.walk(dir_name):        for fname in filenames: if try_to_replace(fname, replace_extensions):     fullname = os.path.join(dirpath, fname)     file_replace(fullname, pat, s_after)if len(sys.argv) != 4:    u = "Usage: mass_replace <dir_name> <string_before> <string_after>n"    sys.stderr.write(u)    sys.exit(1)mass_replace(sys.argv[1], sys.argv[2], sys.argv[3])

编辑:我已经从原始答案更改了上面的代码。有几个变化。首先,

mass_replace()
现在调用
re.compile()
预编译搜索模式;第二,要检查文件的扩展名,我们现在将文件扩展名的元组传递给,
.endswith()
而不是调用
.endswith()
三次。第三,它现在使用
with
最新版本的Python中可用的语句;最后,
file_replace()
现在检查是否在文件中找到了模式,如果未找到模式,则不重写文件。(旧版本将重写每个文件,即使输出文件与输入文件相同,也会更改时间戳;这太小了。)

编辑:我将其更改为默认值,以替换每个文件,但是您可以编辑一行以将其限制为特定的扩展名。我认为替换每个文件是一个更有用的现成默认值。可以使用扩展名列表或不可触摸的文件名,使其不区分大小写的选项等扩展。

编辑:在评论中,@ asciimo指出了一个错误。我对此进行了编辑以修复该错误。

str.endswith()
被证明可以接受尝试的字符串元组,但不能接受列表。固定。另外,我使几个函数接受一个可选参数,以使您可以传入一个扩展元组。修改它以接受命令行参数来指定扩展名应该很容易。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5647566.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存