Python 如何检查CSV文件中是否存在字典中的项目?
我有一本字典和一个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
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)
)
在上一个示例中,您可以从已编译的正则表达式中恢复名称(因为在名称前后添加了beforer'\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”)-ied[0]
需要用空格包围。我可以在d[0]周围添加空格
当我组装dict1
时,这很混乱。在进行迭代时有没有办法添加空格?我也认识到这在我最初的问题中并不清楚,因为我当时没有考虑过,但如果有多个d[0],这将导致一个句子被分配和打印多次
在那个句子中
。最简单的方法是什么?我想与其只做打印
,n
和句子
可以存储在一本字典中,在迭代过程中可以检查句子
。是的,我特别为任何作者添加了打印句子。现在我知道了nt每行一次。如果句子可以在另一行重复,请使用set()
。正则表达式现在只检测整个单词。