我正在运行Python2.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
查找.txt
apple
banana
cherry
替换.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
我知道,不是完全形成的代码。我甚至不知道是否有可能从某一行的某一行或某两行之间搜索一个文件,但我还是有点搞不清这一切的逻辑。最好的方法是什么?
谢谢!
这里有两件事:
不建议使用replace,有关详细信息,请参阅此讨论: Python 2.7: replace method of string object deprecated
如果您担心一次将data.txt读入内存,那么您应该能够一次在data.txt上迭代一行
所以剩下的就是一堆查找/替换对并修复每一行。查看zip函数以获得一种简便的方法
如果文件很大,则希望每次
read
和write
一行,这样就不会立即将整个文件加载到内存中。编辑:我将代码更改为
read().split('\n')
,而不是readliens()
,因此\n
不包含在查找和替换字符串中相关问题 更多 >
编程相关推荐