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 年开始的任何人,如果是的话,它可以为这些人显示行中的数据。

IE

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 :)

这是可能的还是我最好坚持使用原始代码并单独输入每个人的行号?

4

4 回答 4

2

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

我想这就是你要找的东西。

其余:map()、filter() 和任何其他使用函数式编程范式的方法都没有副作用。换句话说,总是捕获返回的值。

于 2013-05-27T04:47:18.417 回答
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;"

所有“吉姆”:

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

每年有多少员工加入?

q = "SELECT COUNT(*) AS 'Total', Year FROM Employees GROUP BY Year;"
于 2013-05-27T05:07:33.213 回答
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

于 2013-05-27T04:44:25.087 回答
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
于 2013-05-27T06:44:40.543 回答