简体   繁体   中英

replace lines in a text file from another text file

I'm new to python and I'm trying a new problem but couldn't get the solution. I've a text file called replace.txt with the contents like this:

 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

Now I have one more file called actual data and it has a huge amount of data like the one above now I want to replace the above lines in actualdata.txt by matching the first number like search for '81' in actualdata.txt and replace it with line having '81' in replace.txt

here the actualdata.txt looks like this:

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

How can I do this please help me I 'm trying to use fileinput and replace but I'm not getting the output.

this is the sample code which I'm still improvising (this is working fyn for one line):

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

this is the code I wrote finally :

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)

But I couldn't get the output the contents of the actualdata.txt are getting deletd, help me with this output I wanted is to change the actualdata.txt like this:

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

Use fileinput module to replace lines 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

By the way I am using python3 . Make appropriate changes if you are using python2

Is replace.txt is also big? If not, you can load that first into memory, build a dictionary and use it to replace lines in actualdata.txt

Here's what I am doing:

  1. First open replace.txt and build a dictionary. Since you are replacing the lines by the first value of the line, we make that as dictionary key. And the whose value will be line you want to replace. Like:

     replacement_data = { '81': '81, 40.001, 49.9996, 49.9958', '82': 82, 41.1034, 54.5636, 49.9958, ... ... } 
  2. Next we start reading the actualdata.txt file, line by line. So, we have to find if the first number of this line whether to be replaced or not. So, we will first split it by , , get the first character and see if it is present in replacement_data dictionary. If it is present, we will replace it and if not, we will simply ignore.

     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 

Putting all pieces together:

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

It generates the original file to:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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