Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于前面的行更改文件中的行-Python_Python_Python 2.7 - Fatal编程技术网

基于前面的行更改文件中的行-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 &

对python来说相对较新,尝试找出解决此问题的最通用和可读的方法。执行速度也不会很差,但它是次要的问题

我有另一个程序的输入文件,需要自动编辑。格式类似于以下内容:

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

请向我们提供测试用例-给定您的文件,告诉我们预期的输出应该是什么样子。ummm
line.startswith(“&”)
?@Nsh刚刚根据我定义的相同参数字典添加了一个示例输出。正如您所看到的,应该编辑的只是数字参数,文件的其余部分的结构应该相同。@Joran不幸的是,数千行文件中的大多数行都以相同的字符开头,我只是试图根据标题和副标题来改变数字参数。这并不能解决你的问题,但你的dict定义中有一个大括号太多了(我假设就在
Truck
之前,请向我们提供测试用例-给定您的文件,告诉我们预期的输出应该是什么样子。ummm
line.startswith(“&”)
?@Nsh刚刚根据我定义的同一个参数字典添加了一个示例输出。正如您所看到的,应该编辑的只是数值参数,文件的其余部分应采用相同的结构。@Joran不幸的是,数千行文件中的大多数行都以相同的字符开头,我只是在尝试更改根据标题和副标题确定数值参数。这并不能解决您的问题,但您的dict定义中有一个大括号太多(我假设是
Truck
之前的括号,请提供我们测试用例-鉴于您的文件,请告诉我们预期输出应该是什么