基于前面的行更改文件中的行-Python
对python来说相对较新,尝试找出解决此问题的最通用和可读的方法。执行速度也不会很差,但它是次要的问题 我有另一个程序的输入文件,需要自动编辑。格式类似于以下内容:基于前面的行更改文件中的行-Python,python,python-2.7,Python,Python 2.7,对python来说相对较新,尝试找出解决此问题的最通用和可读的方法。执行速度也不会很差,但它是次要的问题 我有另一个程序的输入文件,需要自动编辑。格式类似于以下内容: ---Thousands of lines that can be ignored--- &Brand: Ford &Define Class &Model: Sedan &Parameter: Cost &Dollars &25000 &Parameter: Stock &
---Thousands of lines that can be ignored---
&Brand: Ford
&Define Class
&Model: Sedan
&Parameter: Cost
&Dollars
&25000
&Parameter: Stock
&Quantity
&14
&Brand: Honda
&Define Class
&Model: Sedan
&Parameter: Cost
&Dollars
&22000
&Parameter: Stock
&Quantity
&17
&Model: SUV
&Parameter: Cost
&Dollars
&35000
&Parameter: Stock
&Quantity
&7
---Thousands of lines that can be ignored---
我的代码需要自动更改数值参数。我遇到的问题是,我不只是匹配单个条件并更改一条生产线,我匹配的是非唯一生产线的独特组合(参数:成本出现三次,两次出现在车型:轿车下,两次出现在品牌:本田下,但在这两种条件下仅出现一次)
对,我将新参数存储在嵌套字典中,如:
params = {'Ford': {'Sedan': {'Cost': 17000, 'Stock': 43}}, 'Honda':{'Sedan': {'Cost': 19000, 'Stock': 12}, {'Truck': {'Cost': 33000, 'Stock': 5}}}
通过这种方式,我可以在params.keys()中对品牌执行,然后在params.brand.keys()中对模型执行,依此类推
我有打开、关闭和修改文件的基本知识,但我遇到的问题是识别要修改的正确行。谢谢你的帮助
例:
对于上述示例字典,理想的输出是:
---Thousands of lines that can be ignored---
&Brand: Ford
&Define Class
&Model: Sedan
&Parameter: Cost
&Dollars
&17000
&Parameter: Stock
&Quantity
&43
&Brand: Honda
&Define Class
&Model: Sedan
&Parameter: Cost
&Dollars
&19000
&Parameter: Stock
&Quantity
&12
&Model: SUV
&Parameter: Cost
&Dollars
&33000
&Parameter: Stock
&Quantity
&5
---Thousands of lines that can be ignored---
你必须看看Python的正则表达式吗?看看“re”包。您可以使用它来搜索数字条目。您可以像这样识别感兴趣的线条(从我的头顶,而不是选中):
表达式匹配任意数量的数字(d+部分)。不确定&是否特别,但如果特别,可以放在方括号中
当然,您将需要类似的正则表达式来捕获前一行是cost,然后捕获值。你们可以用一个简单的标志来表示网线是成本的
请参见必须查看Python的正则表达式吗?看看“re”包。您可以使用它来搜索数字条目。您可以像这样识别感兴趣的线条(从我的头顶,而不是选中):
表达式匹配任意数量的数字(d+部分)。不确定&是否特别,但如果特别,可以放在方括号中
当然,您将需要类似的正则表达式来捕获前一行是cost,然后捕获值。你们可以用一个简单的标志来表示网线是成本的
请参见必须查看Python的正则表达式吗?看看“re”包。您可以使用它来搜索数字条目。您可以像这样识别感兴趣的线条(从我的头顶,而不是选中):
表达式匹配任意数量的数字(d+部分)。不确定&是否特别,但如果特别,可以放在方括号中
当然,您将需要类似的正则表达式来捕获前一行是cost,然后捕获值。你们可以用一个简单的标志来表示网线是成本的
请参见必须查看Python的正则表达式吗?看看“re”包。您可以使用它来搜索数字条目。您可以像这样识别感兴趣的线条(从我的头顶,而不是选中):
表达式匹配任意数量的数字(d+部分)。不确定&是否特别,但如果特别,可以放在方括号中
当然,您将需要类似的正则表达式来捕获前一行是cost,然后捕获值。你们可以用一个简单的标志来表示网线是成本的
请参见当
到达a\n\n
时,您可以阅读您的行:
import re
model=''
brand=''
whit open('old_file') as f1,open('out_file','w') as f2:
for line in f1:
while line !='\n\n':
if 'Brand' in line :
brand=re.match(r'&Brand:(.*)',line).group(1)
f2.write(line)
elif 'Model' in line:
model=re.match(r'&Model:(.*)',line).group(1)
f2.write(line)
elif model and brand:
if line.strip('&')=='Dollars':
f2.write('Dollars'+'\n'+params[brand.strip()][model.strip()]['Cost'])
elif line.strip('&')=='Quantity':
f2.write('Dollars'+'\n'+params[brand.strip()][model.strip()]['Stock'])
else:
f2.write(line)
当
到达a\n\n
时,您可以阅读您的行:
import re
model=''
brand=''
whit open('old_file') as f1,open('out_file','w') as f2:
for line in f1:
while line !='\n\n':
if 'Brand' in line :
brand=re.match(r'&Brand:(.*)',line).group(1)
f2.write(line)
elif 'Model' in line:
model=re.match(r'&Model:(.*)',line).group(1)
f2.write(line)
elif model and brand:
if line.strip('&')=='Dollars':
f2.write('Dollars'+'\n'+params[brand.strip()][model.strip()]['Cost'])
elif line.strip('&')=='Quantity':
f2.write('Dollars'+'\n'+params[brand.strip()][model.strip()]['Stock'])
else:
f2.write(line)
当
到达a\n\n
时,您可以阅读您的行:
import re
model=''
brand=''
whit open('old_file') as f1,open('out_file','w') as f2:
for line in f1:
while line !='\n\n':
if 'Brand' in line :
brand=re.match(r'&Brand:(.*)',line).group(1)
f2.write(line)
elif 'Model' in line:
model=re.match(r'&Model:(.*)',line).group(1)
f2.write(line)
elif model and brand:
if line.strip('&')=='Dollars':
f2.write('Dollars'+'\n'+params[brand.strip()][model.strip()]['Cost'])
elif line.strip('&')=='Quantity':
f2.write('Dollars'+'\n'+params[brand.strip()][model.strip()]['Stock'])
else:
f2.write(line)
当
到达a\n\n
时,您可以阅读您的行:
import re
model=''
brand=''
whit open('old_file') as f1,open('out_file','w') as f2:
for line in f1:
while line !='\n\n':
if 'Brand' in line :
brand=re.match(r'&Brand:(.*)',line).group(1)
f2.write(line)
elif 'Model' in line:
model=re.match(r'&Model:(.*)',line).group(1)
f2.write(line)
elif model and brand:
if line.strip('&')=='Dollars':
f2.write('Dollars'+'\n'+params[brand.strip()][model.strip()]['Cost'])
elif line.strip('&')=='Quantity':
f2.write('Dollars'+'\n'+params[brand.strip()][model.strip()]['Stock'])
else:
f2.write(line)
该死的。。。我不敢相信我为你浪费了多少时间
该死的。。。我不敢相信我为你浪费了多少时间
该死的。。。我不敢相信我为你浪费了多少时间
该死的。。。我简直不敢相信我为你浪费了多少时间…像这样的事情可能会奏效。我创建了一个生成器,您可以迭代编写更新的文件
def get_lines(dic):
brand = ''
model = ''
parameter = ''
with open('testinput.txt', 'r') as fil:
for line in fil:
if line[1:].strip().isdigit() and brand in dic and model in dic[brand] and parameter in dic[brand][model]:
yield '&{0}\n'.format(dic[brand][model][parameter])
elif line.startswith('&Brand:'):
brand = line.split(': ')[-1].strip()
yield line
elif line.startswith('&Model:'):
model= line.split(': ')[-1].strip()
yield line
elif line.startswith('&Parameter:'):
parameter= line.split(': ')[-1].strip()
yield line
else:
yield line
params = {'Ford': {'Sedan': {'Cost': 17000, 'Stock': 43}}, 'Honda':{'Sedan': {'Cost': 19000, 'Stock': 12}, 'Truck': {'Cost': 33000, 'Stock': 5}}}
with open('output.txt', 'w') as fil:
for line in get_lines(params):
fil.write(line)
像这样的东西可能有用。我创建了一个生成器,您可以迭代编写更新的文件
def get_lines(dic):
brand = ''
model = ''
parameter = ''
with open('testinput.txt', 'r') as fil:
for line in fil:
if line[1:].strip().isdigit() and brand in dic and model in dic[brand] and parameter in dic[brand][model]:
yield '&{0}\n'.format(dic[brand][model][parameter])
elif line.startswith('&Brand:'):
brand = line.split(': ')[-1].strip()
yield line
elif line.startswith('&Model:'):
model= line.split(': ')[-1].strip()
yield line
elif line.startswith('&Parameter:'):
parameter= line.split(': ')[-1].strip()
yield line
else:
yield line
params = {'Ford': {'Sedan': {'Cost': 17000, 'Stock': 43}}, 'Honda':{'Sedan': {'Cost': 19000, 'Stock': 12}, 'Truck': {'Cost': 33000, 'Stock': 5}}}
with open('output.txt', 'w') as fil:
for line in get_lines(params):
fil.write(line)
像这样的东西可能有用。我创建了一个生成器,您可以迭代编写更新的文件
def get_lines(dic):
brand = ''
model = ''
parameter = ''
with open('testinput.txt', 'r') as fil:
for line in fil:
if line[1:].strip().isdigit() and brand in dic and model in dic[brand] and parameter in dic[brand][model]:
yield '&{0}\n'.format(dic[brand][model][parameter])
elif line.startswith('&Brand:'):
brand = line.split(': ')[-1].strip()
yield line
elif line.startswith('&Model:'):
model= line.split(': ')[-1].strip()
yield line
elif line.startswith('&Parameter:'):
parameter= line.split(': ')[-1].strip()
yield line
else:
yield line
params = {'Ford': {'Sedan': {'Cost': 17000, 'Stock': 43}}, 'Honda':{'Sedan': {'Cost': 19000, 'Stock': 12}, 'Truck': {'Cost': 33000, 'Stock': 5}}}
with open('output.txt', 'w') as fil:
for line in get_lines(params):
fil.write(line)
像这样的东西可能有用。我创建了一个生成器,您可以迭代编写更新的文件
def get_lines(dic):
brand = ''
model = ''
parameter = ''
with open('testinput.txt', 'r') as fil:
for line in fil:
if line[1:].strip().isdigit() and brand in dic and model in dic[brand] and parameter in dic[brand][model]:
yield '&{0}\n'.format(dic[brand][model][parameter])
elif line.startswith('&Brand:'):
brand = line.split(': ')[-1].strip()
yield line
elif line.startswith('&Model:'):
model= line.split(': ')[-1].strip()
yield line
elif line.startswith('&Parameter:'):
parameter= line.split(': ')[-1].strip()
yield line
else:
yield line
params = {'Ford': {'Sedan': {'Cost': 17000, 'Stock': 43}}, 'Honda':{'Sedan': {'Cost': 19000, 'Stock': 12}, 'Truck': {'Cost': 33000, 'Stock': 5}}}
with open('output.txt', 'w') as fil:
for line in get_lines(params):
fil.write(line)
请向我们提供测试用例-给定您的文件,告诉我们预期的输出应该是什么样子。ummmline.startswith(“&”)
?@Nsh刚刚根据我定义的相同参数字典添加了一个示例输出。正如您所看到的,应该编辑的只是数字参数,文件的其余部分的结构应该相同。@Joran不幸的是,数千行文件中的大多数行都以相同的字符开头,我只是试图根据标题和副标题来改变数字参数。这并不能解决你的问题,但你的dict定义中有一个大括号太多了(我假设就在Truck
之前,请向我们提供测试用例-给定您的文件,告诉我们预期的输出应该是什么样子。ummmline.startswith(“&”)
?@Nsh刚刚根据我定义的同一个参数字典添加了一个示例输出。正如您所看到的,应该编辑的只是数值参数,文件的其余部分应采用相同的结构。@Joran不幸的是,数千行文件中的大多数行都以相同的字符开头,我只是在尝试更改根据标题和副标题确定数值参数。这并不能解决您的问题,但您的dict定义中有一个大括号太多(我假设是Truck
之前的括号,请提供我们测试用例-鉴于您的文件,请告诉我们预期输出应该是什么