2013-06-18 84 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 

,你沒有定義的列,但忘記將分別獲得該列你要比較的用戶,所以最後你比較一個字符串與列表。

你不需要枚舉,默認情況下你遍歷行。

相關問題