有没有一种方法可以将sqlite查询结果导出到Python中的csv中

时间:2019-05-06 22:17:52

标签: python pandas sqlite

我有一堆带有数据的csv文件(不是数据库文件)。假设有两个csv文件-Candidate.csv和application.csv

鉴于候选人的电子邮件,我需要从这两个csv中提取相关信息并将其提取到单独的csv文件中。

逻辑- 已给定=候选人的电子邮件地址

在候选人.csv上运行查询-从电子邮件='blah@example.com'的候选人中选择*

将结果转储到Candidate-filtered.csv

使用检索到的候选记录的“ Id”列,在application.csv上运行查询

从应用程序中选择*,其中applicationId ='id从先前的查询结果中检索出来'

将结果转储到application-filtered.csv

我需要帮助将结果转储到那些经过过滤的csv中(包括原始csv的列标题,因此任何查看经过过滤的csv的人都知道哪一列引用了哪些数据)

我认为我可以使用SQLITE将csv文件加载到内存表中并对其执行查询(甚至将结果导出到单独的csv文件中。现在SQLITE拥有一种简洁的方法:

.mode csv 
.import 'Candidate.csv candidates'
.headers on
.output 'Candidate-filtered.csv'
Select * from candidates where Email='blah@example.com'

但是,我想使用Python做到这一点,因为我将必须存储每个结果中的变量(例如检索到的候选ID),并在下一个查询(用于应用程序的查询)中使用它们。

现在,我想尝试一下可以在Candidates.csv上运行的代码。

这是我拥有的Python代码:

import sqlite3
import pandas

def extract_Candidate():

    conn = sqlite3.connect(':memory:')
    data = pandas.read_csv('Candidate.csv') 
    data.to_sql('candidates',conn)
    cur = conn.cursor()
    cur.execute("Select * from candidates where Email='blah@example.com'")
    rows = cur.fetchall()
    conn.close()
    return rows

candidateRows = extract_Candidate()
print(candidateRows)

我真的不需要返回候选人变量。只要我可以将结果转储到csv中,就可以了。我可以在终端中打印检索到的行。我不知道如何将其转储到新的csv文件中(我需要原始csv文件中存在的所有列标题)。

大多数搜索引擎结果都显示了如何将内存数据库导出到磁盘。我不要.db文件。我只想将查询结果导出到csv文件中。我看到了一些csv导出代码,但是它们是对列标题进行硬编码的。我希望它采用原始csv中的任何列标题,而无需我进行任何硬编码。

下一步是从所有检索到的候选对象中获取“ Id”列,并以某种数组或集合形式返回它们。我知道这是基本的Python,但对python(或sqlite)一无所知。

也可以随意批评代码(我仍然担心pandas.read_csv是否可以处理巨大的csv文件;让我知道您的想法)。

1 个答案:

答案 0 :(得分:1)

您会接受一个适用于纯熊猫的解决方案,而不是增加sql复杂性吗?关于熊猫大小限制的问题,通常唯一的限制是您的可用系统内存,这也是SQL解决方案的限制。

请注意,以下解决方案未经测试和理论上的限制,因为我们没有任何要测试的样本数据。

import pandas as pd

#we bring in the data
candidates_df = pd.read_csv('Candidate.csv') 
app_df = pd.read_csv('Applications.csv')

#we set the search email
candidate_email = 'blah@example.com'

#we use pandas boolean masking to filter the dataframe and get just the 'id' column
filtered_ids = candidates_df[candidates_df['email']==candidate_email]['id']

#we use the pandas series of ids to filter the applications
filtered_apps = app_df[app_df['id'].isin(filtered_ids)]

#we dump the filtered apps df to a new csv file
filtered_apps.to_csv('directory/file_out.csv')