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

时间:2016-07-13 15:17:53

标签: python file file-io helpers

所以我正在尝试创建一个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 ("\n\n ## Done!\n\n")
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个文件的所有文件,因此您不必在当前目录和文件夹中指定实际目录。

3 个答案:

答案 0 :(得分:1)

正如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))

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

我必须做那样的事情。 我管理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 

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