Dictreader和regex,索引问题

2024-10-05 15:21:58 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,我有一个问题,从我的列表中创建一个所有字符串的列表,匹配正则表达式,以及与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字段名附加到列表中。你知道吗

这是可行的,但是似乎有一个问题,它将一个看似随机的字段名附加到正确的和预期的匹配regex值。你知道吗

也就是说,如果我的数据

名称、位置、价格

有时正则表达式中的if条件会将字段名位置附加到与price关联的数值上。它似乎没有一个可预测的模式,价值是什么。。。你知道吗

结果:

[['firstitem']、['seconditem']、['thirditem']、['fourthitem'、'27']、['fifthitem'、'201']]

[['firstitem'、'1']、['seconditem']、['thirditem'、'12']、['fourthitem']、['fifthitem']]

等等。。你知道吗

所有的数字都是以正确的顺序出现的,它们只是没有按照我所能理解的模式/顺序排列,所以我不知道为什么它们看起来有点随机。任何帮助都将不胜感激。你知道吗


Tags: csv字符串in列表forif模式list
2条回答

给出一个完全人为的csv,如下所示(另存为'测试.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()作为条件语句,而不必使用regex。你知道吗

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

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

这样,更容易理解

相关问题 更多 >