我正在运行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
我知道,没有完全形成的代码。我甚至不知道是否可以在某些行上或某些行之间搜索特定行的文件,但是我再次对它的逻辑感到有些困惑。做这个的最好方式是什么?
谢谢!
答案 0 :(得分:4)
如果文件很大,您希望一次read
和write
一行,那么整个内容不会立即加载到内存中。< / p>
# 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
未包含在查找和替换字符串中
答案 1 :(得分:1)
在这里做几件事:
替换不被弃用,请参阅此讨论以获取详细信息: 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)