我必须使用类型:
的查询来查询此表query(id,mtype,competition,gender,team1,team2,venue,date)
如果给出了查询中的每个参数,我们可以使用if语句来存储结果。但是可能没有提供一些参数。在这种情况下,我们必须考虑所有列值。
另外,我在csv文件中有这些数据。我想将csv文件读入列表然后进行查询。 唯一的问题是,如果用户未在查询中提供参数,则应考虑列中的所有值。
有人可以建议一种方法,只用少量if-else语句或其他方式建议吗?
答案 0 :(得分:1)
您可以将pandas
与read_csv
和query
一起使用,即:
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的方式。