如何在文本文件中查找和替换多行?
我正在运行Python 2.7。
我有三个文本文件:data.txt
,find.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
所以,在上面的例子中,我要搜索的所有出现apple
,banana
以及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
我知道代码不完整。我什至不知道是否可以从某行或某行之间的某行中搜索文件,但是再次,我对这一切的逻辑有些困惑。做这个的最好方式是什么?
谢谢!
-
如果文件很大,你要
read
和write
一次在一个行 ,所以整个事情是不是一次加载到内存中。# 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
不包含在查找和替换字符串中