当前位置: 首页 > 面试题库 >

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

惠翰藻
2023-03-14
问题内容

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

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

谢谢!


问题答案:

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



 类似资料:
  • 问题内容: 我有一个大约40万行的文本文件。我需要将此文本文件导入一个程序,该程序仅接受以空格或制表符分隔的文本文件,但是此文本文件以分号分隔。我要从(Arcmap)导出文本文件的程序中没有选项来更改分隔,并且在文本文件本身中进行查找和替换实际上需要2天。 我已经搜索了一个脚本来执行此操作,但是它们似乎都用空格替换了单词文件的整个LINE,而不是单独替换了每个分号,而给我留了一个空的文本文件。 这

  • 当我检查doc_text字符串时,我可以看到“{Today}”,但“{ConsultantName}”被拆分为多个运行。开始大括号和结束大括号不与单词放在一起--它们之间有XML标记: 代码

  • 我有100个html网页与各种文本翻译。我也有翻译文本准备在一个word文档。所以我要做的就是找到多块不同的文本,然后用多块翻译的文本替换它们。我通常使用dreamweaver,它有一个很好的查找/替换功能,但它一次只能替换一个文本/代码块。更具体地说,举个例子,假设我有3个句子(我个人有更多的句子,大约1000个不同的句子需要替换): 英文文本1、英文文本2、英文文本3。 并且想要同时将所有3个

  • 如何使用PDFBox2.0找到和替换PDF文档中的文本,他们拉出了旧的示例,它的语法不再有效,所以我想知道这是否仍然可能,如果是,最好的方法是什么。谢了!

  • 问题内容: 我有一个文件(更具体地说是一个log4j配置文件),我希望能够读取该文件并在代码中挑选出某些行并替换它们。例如,在文件中,有一串文本,指示文件的存储目录或记录器的级别。我希望能够替换这些文本字符串而无需读入文件,将其写入另一个文件以及删除原始文件。有没有一种使用Java来查找和替换文件中文本的更有效方法? 这是我尝试使用的文本文件的示例: 我希望能够读取文件并将’DEBUG’替换为另一

  • 我正在学习powershell,并尝试编写一个脚本,通过字符串查找目录中的文件,然后对找到的文件进行查找和替换。我想将文件列表存储为一个变量,然后循环遍历文件并替换特定的字符串。这是我的脚本和错误,如果你有任何想法,它将非常感谢。谢谢! 错误 Get-Content:无法将参数绑定到参数“path”,因为它为null。在C:\scripts\script.ps1:5 char:18+(Get-Co