用于在多个文本文件

时间:2015-10-13 09:11:09

标签: python string text-files

我在文件夹中有多个文本文件说“configs”,我想在每个文件中搜索特定文本“-cfg”,并将-cfg之后的数据从打开到关闭逗号(“data”)复制。此结果应在另一个文本文件“result.txt”中更新,文件名,测试名称和每个文件的配置。

注意:每个文件可以在单独的行中包含多个“cfg”以及与该配置相关的测试名称。

例如:cube_demo -cfg“RGB 888; MODE 3”

我的方法是一次打开一个文本文件并找到模式,然后将所需的结果存储到缓冲区中。稍后,将整个结果复制到一个新文件中。

我遇到过Python,看起来很容易在Python中完成。还在学习python并试图找出如何做到这一点。请帮忙。感谢。

我知道如何打开文件并遍历每一行以搜索特定的字符串:

import re
search_term = "Cfg\s(\".*\")"           // Not sure, if it's correct
ifile = open("testlist.csv", "r")
ofile = open("result.txt", "w")
searchlines = ifile.readlines()
for line in searchlines:
    if search_term in line:
        if re.search(search_term, line):
            ofile.write(\1)              
// trying to get string with the \number special sequence
ifile.close()
ofile.close()

但这给了我完整的一行,我找不到如何使用正则表达式来获取“数据”以及如何迭代文件夹中的文件来搜索文本。

1 个答案:

答案 0 :(得分:0)

还没有......

import re
search_term = "Cfg\s(\".*\")"           // Not sure, if it's correct

“//”不是有效的评论标记,您需要“#”

wrt /你的正则表达式,你想要(来自你的规格):'cfg',后跟一个或多个空格,然后是双引号之间的任何文本,停在第一个结束双引号,并想要捕获部分< em>介于这些双引号之间。这拼写为'cfg “(。?)”'。由于您不想处理转义字符,最好的方法是使用原始单引号字符串:

exp = r'cfg *"(.+?)"'

现在因为你要在循环中重用这个表达式,你也可以编译它:

exp = re.compile(r'cfg *"(.+?)"')

所以现在expre.pattern对象而不是字符串。要使用它,可以将其称为search(<text>)方法,并将当前行作为参数。如果该行与表达式匹配,您将获得re.match个对象,否则您将获得None

>>> match = exp.search('foo bar "baaz" boo')
>>> match is None
True
>>> match = exp.search('foo bar -cfg "RGB 888; MODE 3" tagada "tsoin"')
>>> match is None
False
>>> 

要获得双引号之间的部分,请调用match.group(1)(第二个捕获的组,第一个是整个表达式中的一个匹配)

>>> match.group(0)
'cfg "RGB 888; MODE 3"'
>>> match.group(1)
'RGB 888; MODE 3'
>>> 

现在你只需要学习并正确使用文件......首先提示:文件是context managers知道如何关闭自己。第二个提示:文件是可迭代的,无需读取内存中的整个文件。第三个提示:file.write("text") WONT在“text”之后添加换行符。

如果我们将所有这些粘合在一起,您的代码应该类似于:

import re
search_term = re.compile(r'cfg *"(.+?)"')

with open("testlist.csv", "r") as ifile:
    with open("result.txt", "w") as ofile:
        for line in ifile:
            match = search_term.search(line)
            if match:
                ofile.write(match.group(1) + "\n")