首页 > 解决方案 > 有没有办法在 Python 中将 sqlite 查询结果导出到 csv 中

问题描述

我有一堆 csv 文件(不是数据库文件),其中包含数据。假设有两个 csv 文件 - Candidate.csv 和 application.csv

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

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

在 Candidate.csv 上运行查询 - 从 Email='blah@example.com' 的候选人中选择 *

将结果转储到 Candidate-filtered.csv

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

Select * from application where CandidateId='id retrived from previous query result'

将结果转储到 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)

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

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

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

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

标签: pythonpandassqlite

解决方案


如果不增加 sql 复杂性,你会接受一个在纯 pandas 中工作的解决方案吗?关于您关于熊猫大小限制的问题,通常唯一的限制是您的可用系统内存,这也是 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')

推荐阅读