Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查CSV文件中是否存在字典中的项目?_Python_Loops_Csv - Fatal编程技术网

Python 如何检查CSV文件中是否存在字典中的项目?

Python 如何检查CSV文件中是否存在字典中的项目?,python,loops,csv,Python,Loops,Csv,我有一本字典和一个CSV文件(实际上是以制表符分隔的): dict1: {1 : ['Charles', 22], 2: ['James', 36], 3: ['John', 18]} data.csv: [ 22 | Charles goes to the cinema | Activity ] [ 46 | John is a butcher | Profession ] [ 95 | Charles is a firefighter | Professio

我有一本字典和一个CSV文件(实际上是以制表符分隔的):

dict1

{1 : ['Charles', 22],
2: ['James', 36],
3: ['John', 18]}
data.csv


[ 22 | Charles goes to the cinema | Activity    ]
[ 46 | John is a butcher          | Profession  ]
[ 95 | Charles is a firefighter   | Profession  ]
[ 67 | James goes to the zoo      | Activity    ]
我想获取
dict1
值的第一项中的字符串(名称),并在csv的第二列中搜索它。如果名称出现在句子中,我想打印第一个(并且仅打印第一个)句子

但是我在搜索时遇到了问题-在遍历
dict1
时如何访问列/行数据?我试过这样的方法:

with open('data.csv', 'r', encoding='utf-8') as file:
    reader = csv.reader(file, delimiter='\t')
    for (id, (name, age)) in dict1.items():
        if name in reader.row[1] # reader.row[1] is wrong!!!
        print(reader.row[1])
是的,roganjosh是对的。更好的方法是遍历CSV文件并找到任何键

requested={d[0]用于dict1.values()中的d
打开('/tmp/f.csv',换行='')作为csvfile:
对于csv.reader(csvfile,分隔符='\t')中的行:
句子=行[1]
found={n表示请求中的n,如果n表示句子中的n}
对于在中找到的n:
打印(f'{n}:{SENTURE}')
请求-=找到
如果未请求:#优化,使用所有名称
打破

编辑:回答问题,而不是我的想象力


编辑2:澄清后(以及一些新的要求)。。。我希望我击中了

每行只打印一个句子。它不会检查同一句话是否在另一行。您可以使用
set()

我对match worlds使用正则表达式,而不是任何子字符串

导入csv
进口稀土
请求的={re.compile(r'\b'+re.escape(d[0])+r'\b')用于dict1.values()中的d
打开('/tmp/f.csv',换行='')作为csvfile:
对于csv.reader(csvfile,分隔符='\t')中的行:
句子=行[1]
found={n表示请求的if n.search(句子)}
如果发现:
请求-=找到
打印(句子)
如果没有要求:
打破

EDIT3:恢复命中名称(新要求–如real dev项目中的:-p)

首先,您可以匹配多个名称(请参见
len(found)

在上一个示例中,您可以从已编译的正则表达式中恢复名称(因为在名称前后添加了before
r'\b
):

found_name=[r.pattern[2:-2]表示已找到的r]
但我认为这不是最好的办法

更好的方法是将原始名称添加到请求的
。我使用
元组的
集合
。对集合的操作非常快

request={(重新编译(r'\b'+re.escape(d[0])+r'\b'),d[0])
对于dict1.values()中的d
打开('/tmp/f.csv',换行='')作为csvfile:
对于csv.reader(csvfile,分隔符='\t')中的行:
句子=行[1]
在请求的if r.search(句子)}
如果发现:
found_names=元组(n代表r,n在found中)
打印(找到名称、句子)
请求-=找到
如果没有要求:
打破
现在找到的名称(原始
d[0]
)位于列表
found\u names
中。你可以随心所欲地使用它。例如,更改为字符串(请替换
found\u name=
并打印“行”):

found_name=','.join(n代表r,n在found中)
打印(f'{found_names}:{session}')

这里您不需要迭代字典,这是O(1)查找速度的重点您的csv有多大?@roganjosh如果您想使用字典中的每个键,您需要迭代字典…方法是反向的。你想遍历这些行并检查条目是否在dict中,而不是遍历dict并查看它是否与每一行匹配。这两种情况下,字典大约有5000行,cab大约有20000行。非常感谢,但恐怕我无法实现这一点!对我来说,这只是在
csvfile
中打印第一个
行[1]
/
句子,并且(当我要求它打印
d[0]
进行调试时)在该
行[1]
中没有出现的
d[0]
。如果我的问题不清楚,我希望为
dict1.values()
中的每个
d[0]
打印一个
row[1]
,并将该
row[1]
作为
csvfile
中包含
d[0]
的第一个
行。如果它打印第一行,可能第一行(第[1]行包含dict1中定义的子站之一?可以检查它吗?如果可能的话,最好是查看所有输入数据。Ohhh…对于每个
d[0]
没有!抱歉,我现在正在更改答案…是的!尽管在测试时我意识到这是拾取
d[0]
string换句话说(例如“Jonathan”中的“Jon”)-ie
d[0]
需要用空格包围。我可以在
d[0]周围添加空格
当我组装
dict1
时,这很混乱。在进行迭代时有没有办法添加空格?我也认识到这在我最初的问题中并不清楚,因为我当时没有考虑过,但如果有多个
d[0],这将导致一个
句子被分配和打印多次
在那个
句子中
。最简单的方法是什么?我想与其只做
打印
n
句子
可以存储在一本字典中,在迭代过程中可以检查
句子
。是的,我特别为任何作者添加了打印句子。现在我知道了nt每行一次。如果句子可以在另一行重复,请使用
set()
。正则表达式现在只检测整个单词。