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

时间:2013-06-18 21:04:43

标签: python csv

我有一个csv文件格式的大型PC库存。我想写一个代码,帮助我找到所需的信息。具体来说,我想输入用户名的名称或部分名称(用户名位于文件的第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

3 个答案:

答案 0 :(得分:2)

这里有三个问题。

首先,从rows = enumerate(info)开始,row中的每个rows都将成为行号和实际行的元组。

其次,实际行本身是一系列列。

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

if row[1][key_index] == user:

或者,更清楚:

for index, row in rows:
    if row[key_index] == user:
        print row[1]

或者,如果您实际上不需要行号,请不要使用枚举:

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

但这只会让您遇到第三个问题:您希望能够搜索名称​​或名称的一部分。因此,您需要in运算符:

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电子表格附加到数据库进行编辑。)否则,它将只是让事情变得更加复杂。

答案 1 :(得分:0)

enumerate返回索引元素对的迭代器。你真的不需要它。此外,您忘记使用key_index

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

答案 2 :(得分:0)

如果不知道文件的样子,很难说出错了,但我很确定错误是:

for row in info:
    if row[key_Index] == user: #name is in the PC Inventory
        print row #show the computer name

您确定了列的位置,但忘记从您与用户进行比较的每一行中获取该列,因此最后您要将字符串与列表进行比较。

并且您不需要枚举,默认情况下您会遍历行。