用 Python 批量替换文件中的字符串



所以我正在尝试创建一个Python脚本,该脚本将查看*.styles*.layout文件并替换这些文件中的特定字符串。我已经尝试了很多东西,但我无法弄清楚我应该做什么,甚至在线查看其他代码示例只会使理解更加混乱。

这是我目前代码中的内容;

#!/usr/bin/python3
# coding: utf-8
import os
import sys
import fileinput
f1 = open ('*.styles', 'r') # read *.styles
f2 = open ('*.styles', 'w') # write *.styles
f3 = open ('*.layout', 'r') # read *.layout
f4 = open ('*.layout', 'w') # write *.layout
for line in f1:
    f2.write(line.replace('font-size=15','font-size=12'))  # replace string for
    f2.write(line.replace('font-size=14','font-size=12'))  # files in *.styles
    f2.write(line.replace('font-size=18','font-size=14'))
    f2.write(line.replace('font-size=30','font-size=18'))
    f2.write(line.replace('font-size=36','font-size=18'))
    f2.write(line.replace('font-size=16','font-size=12'))
    f2.write(line.replace('font-size=26','font-size=16'))
    f2.write(line.replace('font-size=48','font-size=20'))
    f2.write(line.replace('font-size=28','font-size=16'))
    f2.write(line.replace('font-size=17','font-size=14'))
    f2.write(line.replace('font-size=21','font-size=14'))
f1.close()
f2.close()
for line in f3:
    f4.write(line.replace('font-size=15','font-size=12'))  # replace string for
    f4.write(line.replace('font-size=14','font-size=12'))  # files in *.layout
    f4.write(line.replace('font-size=18','font-size=14'))
    f4.write(line.replace('font-size=30','font-size=18'))
    f4.write(line.replace('font-size=36','font-size=18'))
    f4.write(line.replace('font-size=16','font-size=12'))
    f4.write(line.replace('font-size=26','font-size=16'))
    f4.write(line.replace('font-size=48','font-size=20'))
    f4.write(line.replace('font-size=28','font-size=16'))
    f4.write(line.replace('font-size=17','font-size=14'))
    f4.write(line.replace('font-size=21','font-size=14'))
f3.close()
f4.close()
print ("nn ## Done!nn")
sys.exit(0)

我确实想包含一个"是否要提交更改?[Y/n]",带有简单的是/否用户输入答案,但这有点太复杂了,无法用While True:While False:语句来弄清楚。

当此代码在我想对其进行测试的文件上测试时,它只会显示一个错误;

line 8, in <module>
    f1 = open ('*.styles', 'r') # read *.styles
FileNotFoundError: [Errno 2] No such file or directory: '*.styles'

我只是希望能够像这样从命令行运行;

$ string_search.py .

因此,它会更改当前目录中包含*.styles文件的所有文件,并在该目录中*.layout文件,因此您不必指定实际目录,只需在当前目录和文件夹中即可。

正如斯科特·亨特(Scott Hunter)所写,open打开一个文件。您需要获取匹配文件的列表,并在循环中为每个文件分别调用open。这是如何做到的。

创建一个处理单个文件的函数:

def process_file(filename):
  print(filename)
  # ... open(filename) ...
  # ... open(filename, 'w') ...

然后像这样调用函数:

import glob
for filename in glob.glob('*.styles'):
  process_file(filename)

或者像这样,对于目录和文件的递归枚举:

import os
for dirpath, dirnames, filenames in os.walk('.'):
  for filename in filenames:
    # Instead of .endswith, you can use the fnmatch module to match on '*.styles'.
    if filename.endswith('.styles'):
      process_file(os.path.join(dirpath, filename))

open打开单个文件;您似乎正在尝试使用它来打开与模式匹配的文件集合。 也许您想查看遍历文件目录os.walk,以便您可以单独处理每个文件。

我不得不做这样的事情。我设法fileinput.input这样的东西:首先,我将迭代文件,然后修改它们:

for current_path, dirs, files in os.walk(Your_Path_With_Files)):
            for file in files:
                if file.endswith('.styles'):
                   #here you store the file path somewhere
                   #I'm not 100% the exact way to have the full path,
                   # but it's with os.path.join() to have a clean path
                   #list_path_styles_files 

然后,当您拥有需要修改的文件中的所有路径时:

for the_path in list_path_styles_files:
        for line in fileinput.input(the_path, inplace=1):
                line = line.replace('font-size=15','font-size=12')
                line = ...
                ...
                print line 

这将逐行读取,然后按照您想要的方式修改行,然后将其放入文件中

相关内容

  • 没有找到相关文章

最新更新