使用Python搜索csv文件并提取所需信息

使用Python搜索csv文件并提取所需信息,python,csv,Python,Csv,我有一个csv文件格式的大型电脑清单。我想写一个代码,将帮助我找到所需的信息。具体地说,我想输入用户名或用户名的一部分(用户名位于文件的第5列),并输入代码以提供该计算机的名称(计算机名称位于文件的第二列)。我的代码不起作用,我不知道问题出在哪里。谢谢你的帮助,我很感激 import csv #import csv library #open PC Inventory file info = csv.reader(open('Creedmoor PC Inventory.csv', 'rb'

我有一个csv文件格式的大型电脑清单。我想写一个代码,将帮助我找到所需的信息。具体地说,我想输入用户名或用户名的一部分(用户名位于文件的第5列),并输入代码以提供该计算机的名称(计算机名称位于文件的第二列)。我的代码不起作用,我不知道问题出在哪里。谢谢你的帮助,我很感激

import csv  #import csv library

#open PC Inventory file
info = csv.reader(open('Creedmoor PC Inventory.csv', 'rb'), delimiter=',')

key_index = 4   # Names are in column 5 (array index is 4)
user = raw_input("Please enter employee's name:")
rows = enumerate(info)
for row in rows:
    if row == user: #name is in the PC Inventory
        print row #show the computer name

枚举
返回索引、元素对的迭代器。你真的不需要它。此外,您忘了使用
键索引

for row in info:
    if row[key_index] == user:
        print row

这里有三个问题

首先,由于
rows=enumerate(info)
,因此
rows
中的每个
行都将是行号和实际行的元组

第二,实际行本身是一系列列

因此,如果要将
user
与(索引,行)元组的第五列进行比较,需要执行以下操作:

if row[1][key_index] == user:
或者更清楚地说:

for index, row in rows:
    if row[key_index] == user:
        print row[1]
或者,如果您实际上不需要行号,请不要使用enumerate:

for row in info:
    if row[key_index] == user:
        print row[1]

但这就引出了第三个问题:您希望能够搜索名称或名称的一部分。因此,您需要
中的
操作符:

for row in info:
    if user in row[key_index]:
        print row[1]

将整个内容读入可搜索的数据结构会更清晰:

inventory = { row[key_index]: row for row in info }
然后,您不需要使用
for
循环来搜索用户;您可以这样做:

print inventory[user][1]
然而,不幸的是,这不适用于子字符串搜索。您需要更复杂的数据结构。如果只需要前缀搜索,trie或任何排序/可平分结构都可以工作;如果您需要任意的子字符串搜索,那么您需要一些更奇特的东西,而这可能不值得做

<>你可以考虑使用数据库。例如,对于SQL数据库(如
sqlite3
),可以执行以下操作:

cur = db.execute('SELECT Computer FROM Inventory WHERE Name LIKE %s', name)

导入一个CSV文件并编写一个数据库并不难,如果你打算对一个CSV文件进行大量搜索,那么这可能是值得的。(此外,如果您当前正在通过在Excel或LibreOffice中打开CSV、修改并重新导出文件来编辑文件,则可以将Excel/LO电子表格附加到数据库进行编辑。)否则,这只会无缘无故地使事情变得更复杂。

如果不知道文件的外观,很难判断出问题所在,但我敢肯定错误是:

for row in info:
    if row[key_Index] == user: #name is in the PC Inventory
        print row #show the computer name
您确实定义了列,但忘记了从与用户比较的每一行中获取该列,因此最终您将比较一个字符串和一个列表


而且您不需要枚举,默认情况下,您可以迭代行。

CSV文件是什么样子的?它是一个大表,第5列有用户名,第2列有计算机名,而行列出了所有计算机。abarnert写的东西解决了这个问题!谢谢大家的时间和帮助!