所以我正在尝试创建一个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
个文件的所有文件,因此您不必在当前目录和文件夹中指定实际目录。
答案 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
这将逐行读取行,然后按照您想要的方式修改行,然后将其放入文件