所以我正在尝试创建一个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
这将逐行读取,然后按照您想要的方式修改行,然后将其放入文件中