2013-05-27 58 views
0

我已創建一個文件,其中包含來自我公司的所有數據作爲包含列表的CSV文件夾。僅挑選與列表中的數字相匹配的值

文件夾讀取姓名,年齡,加入年份,年出口作爲列,看起來像這樣:

Name, Age, Join Year, Exit Year 
Mark , 19 , 2001  na 
Mike, 30 , 2000  na 

我試圖找出大家誰在2000年開始到目前爲止,我的代碼讀取

import csv 

with open('Confidential.csv', 'rU') as input: 
    dL= list(csv.reader(input)) 
    sL = dL 
    print sL[2] 

這打印出所有的米克斯數據,因爲我知道這是dL中的行號。

我想知道的是有一種更簡單的方法來顯示2000年的每個人。就像我可以編寫代碼來搜索2000年開始的任何人,如果可以的話,它可以顯示數據那些人。

if raw_input = 2000 
find all 2000 
print line data for any line that contains 2000? 
Like mike, 30, 2000, na because that matches 2000 :) 

這是可能的還是我更好地堅持與原來的代碼,並鍵入單獨每個人的行號?

+1

請加[巨蟒]標記您的問題。 – diegoperini

回答

1

你可以很容易地使用filter內置函數在Python中過濾列表。在你的情況,試試這個:

import csv 

def started_in_2000(person): 
    return person[2] == '2000' 

with open('Confidential.csv', 'rU') as input: 

    all_people= list(csv.reader(input)) 

    people_who_started_in_2000 = filter(started_in_2000, all_people) 

    for person in people_who_started_in_2000: 
     print person 

filter需要兩個參數:一個列表,當通過從列表項,返回真或假的函數。在這種情況下,我創建了一個函數,當一個人在2000年開始時會返回true,並使用該函數過濾掉人員列表。

有關過濾器的更多信息,請查看Python文檔:http://docs.python.org/2/library/functions.html#filter

2

print filter(lambda xs:xs[2]==raw_input(), sL);

這是你在找什麼,因爲我想。

剩餘部分:map(),filter()和其他任何使用函數式編程範例的方法都沒有副作用。換句話說,總是捕獲返回的值。

1

如果您打算對數據進行更多查詢,最好將其轉換爲數據庫。

Python兼容sqlite,它是一個不需要服務器並從簡單文件運行的數據庫。你可以把它想象成具有高級功能的CSV。

所以,這裏是SQLite的方式:

import csv 
import sqlite3 # This imports the drivers for sqlite that come with Python 

database_file = 'employees.db' 
conn = sqlite3.connect(database_file) # Creates a new database, or 
             # opens a connection to the file 
             # if it already exists 

cur = conn.cursor() # A cursor, that we use to execute queries 

q = "CREATE TABLE IF NOT EXISTS Employees (Name, Age, JoinYear, ExitYear);" 
cur.execute(q) # Creates a new Employees table if it doesn't exist 

with open('Confidential.csv', 'rb') as f: 
    reader = csv.DictReader(f) 
    for row in reader: 
     q = """INSERT INTO Employees 
        (Name, Age, JoinYear, ExitYear) 
       VALUES (?,?,?,?);""" 
     cur.execute(q,row) 
     conn.commit() 

# Now we can do stuff like this 

q = "SELECT * FROM Employees WHERE JoinYear = 2000;" 
for result in cur.execute(q): 
    print("{} {} {} {}".format(*result) 

不僅如此,假設你想找出所有的員工不到30歲?

q = "SELECT * FROM Employees WHERE Age < 30;" 

所有的 「吉姆」 S:

q = "SELECT * FROM Employees WHERE Name = 'Jim';" 

有多少員工參加每年?

q = "SELECT COUNT(*) AS 'Total', Year FROM Employees GROUP BY Year;" 
1

做這些操作的最好的模塊是pandas。您可以在10 Minutes to pandas

一個非常簡短的介紹有關問題的解決辦法很簡單,只要

In [1]: import pandas 
In [2]: data = pandas.read_csv('Confidential.csv', delimiter=',', na_values=['na'], skipinitialspace=True) 
In [3]: data  # printing the read data 
Out[3]: 
      Name Age Join Year Exit Year 
     0 Mark 19  2001  NaN 
     1 Mike 30  2000  NaN 

In [3]: data[data['Join Year'] > 2000] # slicing the required data 
Out[3]: 
      Name Age Join Year Exit Year 
     0 Mark 19  2001  NaN 
相關問題