1

我有一个 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
4

3 回答 3

2

你这里有三个问题。

首先,因为rows = enumerate(info),每个rowinrows将是行号和实际行的元组。

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

所以,如果你想比较user一个 (index, row) 元组的第五列,你需要这样做:

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]

但这只会让您遇到第三个问题:您希望能够搜索 name或 name 的一部分。所以,你需要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 电子表格附加到数据库进行编辑。)否则,它将只是无缘无故地让事情变得更复杂。

于 2013-06-18T21:07:51.137 回答
0

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

for row in info:
    if row[key_index] == user:
        print row
于 2013-06-18T21:07:35.247 回答
0

如果不知道您的文件的外观,很难判断出了什么问题,但我很确定错误是:

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

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

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

于 2013-06-18T21:08:46.030 回答