繁体   English   中英

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

[英]replace lines in a text file from another text file

我是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

现在,我还有一个名为实际数据的文件,它具有大量的数据,例如上面的数据。现在,我想通过匹配第一个数字(例如在actualdata.txt中搜索“ 81”)来替换actualdata.txt中的上述行并替换它与replace.txt中具有“ 81”的行

这里的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并替换,但没有得到输出。

这是我仍在即兴使用的示例代码(这对于一行来说是有效的):

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)

但我无法获取输出,删除了actualdata.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------ 

使用的FileInput模块来代替就位行:

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,请进行适当的更改

replace.txt也大吗? 如果没有,您可以先将其加载到内存中,构建一个字典,然后用它替换actualdata.txt行。

这是我在做什么:

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

     replacement_data = { '81': '81, 40.001, 49.9996, 49.9958', '82': 82, 41.1034, 54.5636, 49.9958, ... ... } 
  2. 接下来,我们开始actualdata.txt读取actualdata.txt文件。 因此,我们必须查找是否要替换此行的第一个数字。 因此,我们将首先用,分割它,获取第一个字符,然后查看它是否存在于replacement_data字典中。 如果存在,我们将替换它,否则,我们将忽略。

     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

它将原始文件生成为:

--------lines above--------
81, 40.001, 49.9996, 49.9958
82, 41.1034, 54.5636, 49.9958
...
...
86, 57.4443, 56.6743, 49.9959
87, 59.7, 52.4234, 49.9958 88,  59.725876387298,  47.674633684987,  50.0           
89,  57.511209176153,  43.398353484768,  50.0           
...        
99,  4.9568005100444,  15.000751982196,  50.0
------lines below---------- 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM