我有一个文件如下:
line 1: _____
...
# for AAA
#export CONFIG = AAA_defconfig
# for BBB, BbB, Bbb, BBb3
#export CONFIG = BBB_defconfig
# for CCC, CcC, Ccc, Ccc1
#export CONFIG = CCC_defconfig
...
other lines
我想操纵文件,以便根据给定的字符串,我可以导出正确的“CONFIG”,并评论其他人。 例如如果我得到“CcC”,那么该文件将被操作为
line 1: _____
...
# for AAA
#export CONFIG = AAA_defconfig
# for BBB, BbB, Bbb, BBb3
#export CONFIG = BBB_defconfig
# for CCC, CcC, Ccc, Ccc1
export CONFIG = CCC_defconfig
...
other lines
在python中做到这一点的好方法是什么?
提前致谢!!
答案 0 :(得分:1)
然后为什么不把它作为
line = 'xxxx'
CONFIG = default_deconfig
if line == 'AAA':
CONFIG = AAA_defconfig
elif line == 'CCC':
CONFIG = CCC_defconfig
...
除非这不是一个python文件,你想要操纵它。它看起来像那样。
在这种情况下,创建一个配置生成器,它将根据行变量创建配置文件。
[编辑:根据评论]
您可能需要进行一些调整,但这应该有效。
# Simple , crude solution
f = open('file1', 'r')
manipulated_lines = []
readFirstLine = False
config = ''
configComma = ''
uncommentLine = 0
for line in f:
tokens = line.split()
if uncommentLine == 1:
# this is comment line
if tokens[0] == '#export':
manipulated_lines.append(line[1:])
uncommentLine = uncommentLine + 1
continue
elif uncommentLine > 1:
manipulated_lines.append(line)
continue
if not readFirstLine:
config = line.rstrip('\n')
configComma = config + ','
readFirstLine = True
# Process additional lines
manipulated_lines.append(line)
if len(tokens) > 0 and tokens[0] == '#':
if tokens[1] == 'for':
if config in tokens or configComma in tokens:
uncommentLine = uncommentLine + 1
continue
print manipulated_lines
f.close()
fw = open('file2', 'w')
fw.writelines(manipulated_lines)
fw.close()
输入:file1
CCC
# for AAA
#export CONFIG = AAA_defconfig
# for BBB, BbB, Bbb, BBb3
#export CONFIG = BBB_defconfig
# for CCC, CcC, Ccc, Ccc1
#export CONFIG = CCC_defconfig
...
输出:file2
CCC
# for AAA
#export CONFIG = AAA_defconfig
# for BBB, BbB, Bbb, BBb3
#export CONFIG = BBB_defconfig
# for CCC, CcC, Ccc, Ccc1
export CONFIG = CCC_defconfig
...
答案 1 :(得分:1)
def select_export(text, source, destination):
uncomment_next = False
for line in source:
line = line.strip()
if line.startswith('# for ') and text in set(t.strip()
for t in line[6:].split(',')):
uncomment_next = True
elif line.startswith('#') and uncomment_next:
line = line[1:]
uncomment_next = False
destination.write(line + '\n')
with open('source') as f:
with open('destination', 'w') as w:
select_export('CcC', f, w)
答案 2 :(得分:1)
更清洁,更易读的方法IMO。
(并且,是的,要修改文件中的一行,您必须覆盖并重写整个文件。)
#!/usr/bin/env python2.7
import re
def find_and_modify(config_file, given_string):
with open(config_file) as f:
lines = f.readlines()
given_string_re = re.compile(r'# for .*{}'.format(given_string))
# line #'s that start with either "export" or "#export"
export_line_numbers = []
# the line # containing the given_string we're searching for
uncomment_line_number = None
for i,line in enumerate(lines):
if re.match(r'#?export', line):
export_line_numbers.append(i)
prev_line = lines[i-1]
if given_string_re.match(prev_line):
uncomment_line_number = i
for i in export_line_numbers:
if i == uncomment_line_number:
lines[i] = re.sub(r'^#*', '', lines[i])
else:
lines[i] = re.sub(r'^#*', '#', lines[i])
with open(config_file, 'w') as f:
f.writelines(lines)
find_and_modify('some_file', 'AAA')
find_and_modify('some_file', 'CcC')
答案 3 :(得分:1)
首先创建一个生成器函数:
import re
def uncomment(seq, prev_pattern, curr_pattern):
"""Remove comment from any string in seq matching curr_pattern if the previous line matches prev_pattern"""
prev = ""
for curr in seq:
if re.match(curr_pattern, curr) and re.match(prev_pattern, prev):
yield curr[1:]
else:
yield curr
prev = curr
现在测试一下:
>>> lines = ["leave this alone", "#fix next line", "#fix this line", "leave this alone"]
>>> print "\n".join(uncomment(lines, "^#fix next", "^#fix this"))
leave this alone
#fix next line
fix this line
leave this alone
现在用它来修复你的文件:
with open(input_filename, 'r') as f_in:
with open(output_filename, 'w') as f_out:
for line in uncomment(f_in, "^#for AAA", "^#export CONFIG"):
f_out.write(line)