如何在文本文件中查找和替换多行?

发布于 2021-01-29 17:58:05

我正在运行Python 2.7。

我有三个文本文件:data.txtfind.txt,和replace.txt。现在,find.txt包含我要搜索的几行data.txt并将该部分替换为中的内容replace.txt。这是一个简单的示例:

data.txt

pumpkin
apple
banana
cherry
himalaya
skeleton
apple
banana
cherry
watermelon
fruit

find.txt

apple
banana
cherry

replace.txt

1
2
3

所以,在上面的例子中,我要搜索的所有出现applebanana以及cherry在数据和更换这些线路1,2,3

我在使用正确的方法时遇到了一些麻烦,因为我data.txt的内存大约为1MB,所以我想尽可能地提高效率。一种愚蠢的方法是将所有内容连接成一个长字符串并使用replace,然后输出到新的文本文件,以便所有换行符都将被恢复。

import re

data = open("data.txt", 'r')
find = open("find.txt", 'r')
replace = open("replace.txt", 'r')

data_str = ""
find_str = ""
replace_str = ""

for line in data: # concatenate it into one long string
    data_str += line

for line in find: # concatenate it into one long string
    find_str += line

for line in replace: 
    replace_str += line


new_data = data_str.replace(find, replace)
new_file = open("new_data.txt", "w")
new_file.write(new_data)

但是对于像我这样的大数据文件来说,这似乎是如此令人费解和低效。另外,该replace功能似乎已被弃用,因此效果不佳。

另一种方法是单步执行并跟踪找到匹配的哪一行。

像这样:

location = 0

LOOP1: 
for find_line in find:
    for i, data_line in enumerate(data).startingAtLine(location):
        if find_line == data_line:
            location = i # found possibility

for idx in range(NUMBER_LINES_IN_FIND):
    if find_line[idx] != data_line[idx+location]  # compare line by line
        #if the subsequent lines don't match, then go back and search again
        goto LOOP1

我知道代码不完整。我什至不知道是否可以从某行或某行之间的某行中搜索文件,但是再次,我对这一切的逻辑有些困惑。做这个的最好方式是什么?

谢谢!

关注者
0
被浏览
161
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果文件很大,你要readwrite 一次在一个行 ,所以整个事情是不是一次加载到内存中。

    # create a dict of find keys and replace values
    findlines = open('find.txt').read().split('\n')
    replacelines = open('replace.txt').read().split('\n')
    find_replace = dict(zip(findlines, replacelines))
    
    with open('data.txt') as data:
        with open('new_data.txt', 'w') as new_data:
            for line in data:
                for key in find_replace:
                    if key in line:
                        line = line.replace(key, find_replace[key])
                new_data.write(line)
    

    编辑:我将代码更改为,read().split('\n')而不是readliens()这样,因此\n不包含在查找和替换字符串中



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看