2013-06-18 42 views
1

我有一个csv文件格式的大型PC库存。我想编写一个代码来帮助我找到所需的信息。具体来说,我想输入用户名称或用户名称的一部分(用户名称位于文件的第5列),并让代码给我该计算机的名称(计算机名称位于文件中的第二列)。我的代码不起作用,我不知道是什么问题。感谢您的帮助,我很感激!使用Python搜索csv文件并提取所需的信息

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 
+0

CSV文件的外观如何? – Blender

+0

这是一个大型表,第5列有用户名,第2列有计算机名,行列出所有计算机。什么abarnert写道解决了这个问题!感谢大家的时间和帮助! – 1vko

回答

2

这里有三个问题。

首先,由于rows = enumerate(info),在rows每个row将是行号和实际行的元组。

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

所以,如果你想比较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电子表格附加到数据库进行编辑。)否则,它将会无缘无故让事情变得更加复杂。

0

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

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

这很难说什么是错的不知道你的文件的样子,但我敢肯定,错误的是:

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

,你没有定义的列,但忘记将分别获得该列你要比较的用户,所以最后你比较一个字符串与列表。

你不需要枚举,默认情况下你遍历行。

相关问题