如何在循环中修改文本文件中的特定行?

Posted

技术标签:

【中文标题】如何在循环中修改文本文件中的特定行?【英文标题】:how to modify specific lines in a text file in a loop? 【发布时间】:2014-08-05 04:49:08 【问题描述】:

我正在使用 python 2.7 (OS-centos6)

我有一个文本文件。例如,它由以下几行组成:

0     4.064  16.786   7.016    0
1     5.520  14.733   5.719    0
2     5.904  17.898   5.222    0
3     3.113  18.613  18.453    0
4     3.629  16.760   5.118    0
            :
            :
            :
398   6.369  14.623    6.624    0
399   5.761  18.084    7.212    0
400   2.436  17.021   10.641    0

最后一列最初包含全 0。它基本上是一面旗帜。 我想修改这个文本文件,即我想让最后一列条目为 1(即将标志值更改为 1)每当某些标准与特定行匹配。例如,行号 3,20,250,400 满足此标准。然后我想让这些特定行的标志值(最后一列条目)为 1,而不更改这些行上存在的其他值。 另外,我想循环执行此操作,因为我有很多标准。因此,我每次都必须转到文件顶部(即每个标准)并从上到下扫描它;每当满足条件时,将特定行的标志标记为 1。

重要提示:我正在使用相同的修改文件,然后只选择标志值不是 1 的那些行(用于进一步处理)。对于上述循环的每次迭代,我想阅读这个修改后的文件。这意味着,简而言之,我想为一个标准修改文件(即将标志设置为 1)-> 然后读取修改后的文件--> 进行处理--> 然后采用下一个标准--> 将标志设置为 1此标准--> 读取修改后的文件--> 依此类推。

我想补充一下: 要满足的标准每次都考虑两条不同的线。 例如如果第 3 行和第 398 行的第 2 列条目之间的差异小于 2.0,则将第 398 行的标志设置为 1。即差异 17.898 - 18.084 小于 2.0,因此第 398 行的标志将设置为 1

我们将不胜感激。

【问题讨论】:

我认为您需要数据库来执行此操作。 使用 for 循环遍历文件的行,并将同一行写入带有修改标志的新(或同一文件)。您绝对不需要数据库,尽管它可能更有意义。 【参考方案1】:

好的。首先,您需要打开文件并阅读每一行。

我建议从一个文件中逐行读取文件并将其写入第二个文件。

with open("original.dat", "r"), open("new.dat", "w") as source, destination:
    for line in source:
        # split on spaces is the default:
        line_no, v1, v2, v3, flag = line.split()
        # just an example, do whatever checks you need to
        should_set_flag = some_computation(v1, v2, v3)
        if should_set_flag: 
            flag = 1
        destination.write("    \n".format(line_no, v1, v2, v3, flag))

也许我不理解您每次进行更改时都阅读整个文件的要求。鉴于这些线条似乎彼此独立,我不确定为什么这是必要的。

【讨论】:

@Mike:我每次都需要读取/扫描整个文件,因为:假设第 1、5、13、200、350 行的标志设置为 1 为 FIRST 标准。所以其他行的标志是 0。我的条件是,我必须始终从每个下一个标准的标志为 0 的行开始。【参考方案2】:
    f=open("filename",'r')
    data=f.readlines()
    f.close()
    #remove file by using os.rm or using subprocess
    i=0
    while i < len(data):
          #do something
          #make changes to data list
    f=open("filename",'w')
    f.write(data)

这可能是唯一的方法。加载数据,删除旧文件,进行更改,写入新文件。

【讨论】:

【参考方案3】:

为什么需要写回文件?它只有400行,你可以将这些行保存在内存中并一一处理:

def is_criterion_1_fulfilled(row):
    return row[1]<4 # only an example

def process_1(row):
    print row # or do anything else with the line

def filter_and_process(iterator, criterion, process):
    for row in iterator:
        if criterion(row):
            continue
        process(row)
        yield row

def main():
    with open(filename, 'r') as inp:
        dataset = [map(float, line.split()) for line in inp]
    dataset = list(filter_and_process(dataset, is_criterion_1_fulfilled, process_1))
    dataset = list(filter_and_process(dataset, is_criterion_2_fulfilled, process_2))
    ....

if __name__ == '__main__':
    main()

【讨论】:

【参考方案4】:
# Imports
import re

# Functions
def check_data(record, records):
    # TODO Implement check operation
    return False

# Read input data
infile = "data.txt"
with open(infile, "r") as f:
    # Make a list of lists
    records = [re.split('\s+',record) for record in f.read().splitlines()]

# Process the data
for i, record in enumerate(records):
    # enumerate so as to refer to ith record if necessary,
    # but lineno anyway available in record[0]
    if check_data(record, records):
        record[4] = '1'


# Write modified data
outfile = "out%s" % infile
with open(outfile, "w") as f:
    for record in records:
        f.write('\t'.join(record)+'\n')

【讨论】:

以上是关于如何在循环中修改文本文件中的特定行?的主要内容,如果未能解决你的问题,请参考以下文章

如何跳转到巨大文本文件中的特定行?

在 C 中使用 fscanf 扫描文本文件中的特定行?

满足特定条件时如何将行写入文本文件

将文本文件中的特定行读取到批处理文件中的变量

在 Python 中编辑文本文件中的特定行

如何在文本文件中逐行替换特定行?