使用列的默认值查询csv文件

时间:2017-04-23 11:15:46

标签: python csv pandas

enter image description here

我必须使用类型:

的查询来查询此表
query(id,mtype,competition,gender,team1,team2,venue,date)

如果给出了查询中的每个参数,我们可以使用if语句来存储结果。但是可能没有提供一些参数。在这种情况下,我们必须考虑所有列值。

另外,我在csv文件中有这些数据。我想将csv文件读入列表然后进行查询。 唯一的问题是,如果用户未在查询中提供参数,则应考虑列中的所有值。

有人可以建议一种方法,只用少量if-else语句或其他方式建议吗?

2 个答案:

答案 0 :(得分:1)

您可以将pandasread_csvquery一起使用,即:

import pandas as pd
# csv file should have the field names on the first row
# id,mtype,competition,gender,team1,team2,venue,date
df = pd.read_csv("the_file.csv", sep=",")
df['date'] = pd.to_datetime(df['date']) # convert date to a datetime object

mtype = "ODM"
sd = "2017-02-18"
ed = "2017-02-20"

df_query = df.query("mtype == '{}' and date > '{}' and date < '{}'".format(mtype, sd, ed))
print df_query

选项2

您还可以将csv文件转换为sqlite数据库并在那里发出查询,例如:

csv导入sqlite

import csv
import sqlite3
import os.path

csv_file = "csv_to_db.csv"
db_file = "csv_to_db.sqlite"
if not os.path.exists(db_file): # if no db_file we create one
    con = sqlite3.Connection(db_file,detect_types=sqlite3.PARSE_DECLTYPES)
    cur = con.cursor()
    # csv fields: id,mtype,competition,gender,team1,team2,venue,date
    cur.execute('CREATE TABLE "venues" ("id" int primary key, "mtype" text,'
                ' "competition" text, "gender" text, "team1" text, '
                '"team2" text, "venue" text, "venue_date" date);')

    f = open(csv_file)
    csv_reader = csv.reader(f, delimiter=',')

    cur.executemany('INSERT INTO venues VALUES (?, ?, ?, ?, ?, ?, ?, ?)', csv_reader)
    cur.close()
    con.commit()
    con.close()
    f.close()

现在我们可以开始查询数据库了。你问过:

  

您能否提供query(mtype,start_date,end_date)类型的示例   缺少所有其他参数?

为此您可以使用:

conn = sqlite3.connect(db_file,detect_types=sqlite3.PARSE_DECLTYPES)
c = conn.cursor()

start_date = "2017-02-15"
end_date = "2017-02-20"

c.execute("SELECT * FROM {table} WHERE mtype='{query}' AND venue_date BETWEEN date('{start_date}') AND date('{end_date}')".format(table="venues", query="ODM", start_date=start_date, end_date=end_date))
all_rows = c.fetchall()
print( all_rows)

抓住完整的gist

答案 1 :(得分:-2)

您可以使用Pandas,它提供filter rows的方式。