使用Python搜索csv文件并提取所需信息
我有一个csv文件格式的大型电脑清单。我想写一个代码,将帮助我找到所需的信息。具体地说,我想输入用户名或用户名的一部分(用户名位于文件的第5列),并输入代码以提供该计算机的名称(计算机名称位于文件的第二列)。我的代码不起作用,我不知道问题出在哪里。谢谢你的帮助,我很感激使用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'
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写的东西解决了这个问题!谢谢大家的时间和帮助!