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

2024-04-29 10:33:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行Python2.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

查找.txt

apple
banana
cherry

替换.txt

1
2
3

因此,在上面的例子中,我想搜索数据中所有出现的applebananacherry并用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

我知道,不是完全形成的代码。我甚至不知道是否有可能从某一行的某一行或某两行之间搜索一个文件,但我还是有点搞不清这一切的逻辑。最好的方法是什么?

谢谢!


Tags: 方法intxtapplenewfordataline
2条回答

这里有两件事:

不建议使用replace,有关详细信息,请参阅此讨论: Python 2.7: replace method of string object deprecated

如果您担心一次将data.txt读入内存,那么您应该能够一次在data.txt上迭代一行

data = open("data.txt", 'r')
for line in data:
    # fix the line

所以剩下的就是一堆查找/替换对并修复每一行。查看zip函数以获得一种简便的方法

find = open("find.txt", 'r').readlines()
replace = open("replace.txt", 'r').readlines()
new_data = open("new_data.txt", 'w')
for find_token, replace_token in zip(find, replace):
    new_line = line.replace(find_token, replace_token)
    new_data.write(new_line + os.linesep)

如果文件很大,则希望每次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不包含在查找和替换字符串中

相关问题 更多 >