2013-05-27 1 views
0

Я создал файл, содержащий все данные из моей компании в виде папки CSV со списком.Выбрав только значения, соответствующие числу из списка

Папка читает Имя, Возраст, Join года, Выход года в колоннах и выглядит следующим образом:

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

Вы можете легко фильтровать списки в python, используя встроенную функцию filter. В вашем случае, попробуйте следующее:

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 принимает два аргумента: список, и функцию, которая возвращает истину или ложь при передаче предметов из списка. В этом случае я создал функцию, которая возвращает true, когда человек начал работать в 2000 году, и отфильтровал список людей, использующих эту функцию.

Для получения дополнительной информации о фильтре, проверьте документацию питона: http://docs.python.org/2/library/functions.html#filter

2

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

Это то, что вы ищете я полагаю.

Remainder: 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;" 

Все "Jim" 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