Python - 从文本文件调用行来编译第二个文件的模式搜索

时间:2014-11-05 02:40:49

标签: python python-2.7 python-3.x

如果有人问及回答,请原谅我。如果是这样的话,请将其归结为我不熟悉编程并且不太了解正确搜索。

我需要在包含一系列数百个短语的文件中读取,例如名称或电子邮件地址,每行一个,用作编译搜索词的一部分 - pattern = re.search(name) 。 '模式'变量将用于搜索超过500万行的另一个文件,以识别和提取相关行的选择字段。

为变量读入的名称文件的文本格式为:

John\n
Bill\n
Harry@helpme.com\n
Sally\n

到目前为止,我有以下代码,它没有错误输出,但也没有处理和关闭。如果我使用sys.argv [1]使用略有不同的代码手动传递名称,一切正常。粗体代码(应该是)是我遇到问题的区域 - 从" lines = open ...."

开始
import sys
import re
import csv
import os

searchdata = open("reallybigfile", "r")
Certfile = csv.writer(open('Certfile.csv', 'ab'), delimiter=',')

**lines = open("Filewithnames.txt", 'r')
while True:
    for line in lines:
        line.rstrip('\n')
        lines.seek(0)
        for nam in lines:
             pat = re.compile(nam)**

for f in searchdata.readlines():
    if pat.search(f):
        fields = f.strip().split(',') 
        Certfile.writerow([nam, fields[3], fields[4]])
lines.close()

底部的代码(起始"对于searchdata.readlines()中的f:")可以很好地定位,提取和写入字段。我一直无法找到一种方法来读取Filewithnames.txt文件并让它使用每一行。它或者像这个代码一样挂起,或者它将文件的所有行读到最后一行并仅返回最后一行的数据,例如'萨利'

提前致谢。

1 个答案:

答案 0 :(得分:2)

while True是一个无限循环,没有办法突破它我能看到的。这肯定会导致程序继续运行并且不会抛出错误。

删除while True行并取消该循环代码的缩进,看看会发生什么。

编辑:

我已经解决了一些问题,如评论所述,但我会留下您找出实现目标所需的准确正则表达式。

import sys
import re
import csv
import os

searchdata = open("c:\\dev\\in\\1.txt", "r")
# Certfile = csv.writer(open('c:\\dev\\Certfile.csv', 'ab'), delimiter=',') #moved to later to ensure the file will be closed

lines = open("c:\\dev\\in\\2.txt", 'r')
pats = []   # An array of patterns
for line in lines:
    line.rstrip()
    lines.seek(0)
    # Add additional conditioning/escaping of input here.
    for nam in lines:
         pats.append(re.compile(nam))

with open('c:\\dev\\Certfile.csv', 'ab') as outfile:    #This line opens the file
    Certfile = csv.writer(outfile, delimiter=',')       #This line interprets the output into CSV
    for f in searchdata.readlines():
        for pat in pats:    #A loop for processing all of the patterns
            if pat.search(f) is not None:
                fields = f.strip().split(',') 
                Certfile.writerow([pat.pattern, fields[3], fields[4]])
lines.close()
searchdata.close()

首先,确保关闭所有文件,包括输出文件。 如前所述,while True循环导致您无限运行。 你需要一个正则表达式或一组正则表达式来覆盖你所有可能的名字。"代码更容易做一组正则表达式,所以这就是我在这里所做的。这可能不是最有效的。这包括一个处理所有模式的循环。

我相信您需要对输入文件进行额外的解析才能为您提供干净的正则表达式。我为你留下了一些空间。

希望有所帮助!