从另一个文本文件替换文本文件中的行

时间:2014-10-17 03:50:03

标签: python

我是python的新手,我尝试了一个新问题,但无法获得解决方案。我有一个名为replace.txt的文本文件,内容如下:

 81, 40.001, 49.9996, 49.9958
 82, 41.1034, 54.5636, 49.9958
 83, 44.2582, 58.1856, 49.9959
 84, 48.7511, 59.9199, 49.9957
 85, 53.4674, 59.3776, 49.9958
 86, 57.4443, 56.6743, 49.9959
 87, 59.7, 52.4234, 49.9958

现在我还有一个名为实际数据的文件,它有大量的数据,如上所述,我想通过匹配搜索' 81&#的第一个数字来替换actualdata.txt中的上述行39;在actualdata.txt中,将其替换为具有' 81'在replace.txt

这里的actualdata.txt看起来像这样:

--------lines above--------
81,  40.0           ,  50.0           ,  50.0           
82,  41.102548189607,  54.564575695695,  50.0           
83,  44.257790830341,  58.187003960661,  50.0           
84,  48.751279796738,  59.921728571875,  50.0           
85,  53.468166336575,  59.379329520912,  50.0           
86,  57.445611860313,  56.675542227082,  50.0           
87,  59.701750075154,  52.424055585018,  50.0           
88,  59.725876387298,  47.674633684987,  50.0           
89,  57.511209176153,  43.398353484768,  50.0           
90,  53.558991157616,  40.654756186166,  50.0           
91,  48.853051436724,  40.06599229952 ,  50.0           
92,  44.335578609695,  41.75898487363 ,  50.0           
93,  41.139049269956,  45.364964707822,  50.0           
94,  4.9858306110506,  4.9976785333108,  50.0           
95,  9.9716298556132,  4.9995886389273,  50.0           
96,  4.9712790759448,  9.9984071508336,  50.0           
97,  9.9421696473295,  10.002460334272,  50.0           
98,  14.957223264745,  5.0022762348283,  50.0           
99,  4.9568005100444,  15.000751982196,  50.0
------lines below---------- 

我该怎么做呢请帮助我我尝试使用fileinput并替换但我没有得到输出。

这是我仍在即兴创作的示例代码(这是一行的fyn):

oldline='        82,  41.102548189607,  54.564575695695,  50.0'
newline='    81, 40.001, 49.9996, 49.9958'

for line in fileinput.input(inpfile, inplace = 1): 
      print line.replace(oldline,newline),

这是我最后写的代码:

replacefile= open('temp.txt','r')
for line1 in replacefile:
    newline = line1.rstrip()
        rl=newline
        rl=rl.split()
        search =rl[0]
        with open(inpfile) as input:
        intable = False
        for line in input:
            fill=[]
            if line.strip() == "*NODE":
            intable = True
            if line.strip() == "---------------------------------------------------------------":
            intable = False
            if intable:
              templine=(line.rstrip())
              tl=line.rstrip()
              tl= tl.split()
              if tl[0] == search:
                oldline=templine
                for line2 in fileinput.input(inpfile, inplace = 1): 
                    line2.replace(oldline,newline)

但是我无法获得输出,realdata.txt的内容正在被删除,请帮助我 我想要的输出是改变这样的actualdata.txt:

  -------lines above------
     81, 40.001, 49.9996, 49.9958
     82, 41.1034, 54.5636, 49.9958
     83, 44.2582, 58.1856, 49.9959
     84, 48.7511, 59.9199, 49.9957
     85,  53.468166336575,  59.379329520912,  50.0           
    86,  57.445611860313,  56.675542227082,  50.0           
    87,  59.701750075154,  52.424055585018,  50.0           
    88,  59.725876387298,  47.674633684987,  50.0           
    89,  57.511209176153,  43.398353484768,  50.0           
    90,  53.558991157616,  40.654756186166,  50.0 
    -------lines below------ 

2 个答案:

答案 0 :(得分:1)

使用fileinput模块替换 inplace

import fileinput
def get_next_line(fptr):
    x = fptr.readline()
    if(x != ''):
        return x.strip(), x.strip().split()[0].strip()
    else:
        return '',''

f = open("replace.txt", "r")

f_line, f_line_no = get_next_line(f)

for line in fileinput.input("actualdata.txt", inplace=True):
    if(line.strip().split()[0].strip() == f_line_no):          #if line number matches
        print(f_line)                                          # write newline
        f_line, f_line_no = get_next_line(f)                   # Get next newline
    else:                                                      # Otherwise
        print(line.strip())                                    # write original one

顺便说一句,我使用 python3 。如果您使用 python2

,请进行适当的更改

答案 1 :(得分:0)

replace.txt也很大吗?如果没有,您可以先将其加载到内存中,构建一个字典并用它来替换{​​{1}}中的行

这就是我在做的事情:

  1. 首先打开actualdata.txt并构建字典。由于您要用行的第一个值替换行,我们将其作为字典键。并且其值将是您想要替换的行。像:

    replace.txt
  2. 接下来,我们逐行开始阅读replacement_data = { '81': '81, 40.001, 49.9996, 49.9958', '82': 82, 41.1034, 54.5636, 49.9958, ... ... } 文件。所以,我们必须找到这条线的第一个数字是否要被替换。因此,我们将首先将其拆分为actualdata.txt,获取第一个字符并查看它是否存在于,字典中。如果它存在,我们将替换它,如果没有,我们将忽略。

    replacement_data
  3. 把所有部分放在一起:

    line = "83,  44.257790830341,  58.187003960661,  50.0"
    first_char = line.split(',')[0].strip() #first char is 83
    # lets check whether to replace it or not
    if first_char in replacement_data.keys(): 
        # if key exists, we have to replace
        line = replacement_data[first_char]
        print line # so that it writes to file
    

    它生成原始文件:

    import fileinput
    import sys
    
    inpfile = 'actualdata.txt'
    replacement_file = 'replace.txt'
    
    replacement_data = {}
    
    with open(replacement_file) as f:
        for line in f:
            key = line.split(',')[0].strip()
            replacement_data[key] = line
    
    for line in fileinput.input(inpfile, inplace = 1): 
        first_char = line.split(',')[0].strip()
        try:
            int(first_char)
            line = replacement_data[first_char]
            print line,
        except (ValueError, KeyError):
            print line,
            continue