Dictreader和regex,索引问题

时间:2016-10-28 10:56:24

标签: python dictionary arraylist

嘿我有一个问题是创建一个列表,列出我的列表中与正则表达式匹配的所有字符串,以及与DictReader关联的字段名称。

我循环遍历一个字符串数组,并试图查看每个字符串是否与模式匹配:

 reader = csv.DictReader(file)
    for mystr in reader: 
        for i in range(len(mystr)):
            if re.search(pattern, list(mystr.values())[i]):
               data.append([list(reader.fieldnames)[i],list(mystr.values())[i]])

当字符串与模式匹配时,它会将匹配的字符串和csv字段名称附加到列表中。

这是有效的,但似乎有一个问题,它将一个看似随机的字段名称附加到正确和预期匹配的正则表达式值。

I.E,如果订购了我的数据

名称,位置,价格

有时来自正则表达式的if条件会将字段名称位置附加到与price相关联的数值。似乎没有可预测的模式,关于哪个值是相关联的......

结果:

[[' firstitem'],[' seconditem'],[' thirditem'],[' Fourthitem',' ; 27'],[' Fifthitem',' 201']]

[[' firstitem',' 1'],[' seconditem'],[' thirditem'' 12& #39;],[' Fourthitem'],[' Fifthitem']]

等。

这些数字都以正确的顺序出现,它们只是没有对齐我可以读作的模式/顺序,所以我不确定为什么它们看起来有点随机。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我认为您可以像这样简化代码:

 reader = csv.DictReader(file)
    for mystr in reader:
        for fieldname, value in mystr.items():
            if re.search(pattern, value):
                data.append([fieldname, value])

这样,它更容易理解......

答案 1 :(得分:2)

给出一个完全设计的csv,如下所示(保存为'test.csv'):

firstitem, seconditem, thirditem, fourthitem, fifthitem
first, price, 1, nothing, important
second, price, 2, over, here

然后以下内容应该用整数提取所有列:

>>> def get_items(pattern, csv_file):
        with open(csv_file) as file:
            for entry in csv.DictReader(file):
                for field_name, value in entry.items():
                    if re.search(pattern, value):
                        yield [field_name, value]

>>> data = list(get_items(r'\d+', 'test.csv'))
[[' thirditem', ' 1'], [' thirditem', ' 2']]

或者,您可以使用if value.strip().isdigit()作为条件语句,而不必使用正则表达式。