python - 有没有办法在 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 文件;让我知道你的想法)。
解决方案
如果不增加 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')
推荐阅读
- excel - 定期使用空格自定义格式文本 - Excel
- javascript - 想显示投资组合图片,但我遇到了一些错误
- python - 没有正确捕获异常的装饰器
- javascript - 使用 javascript 在 html 页面中显示 blob 图像
- mysql - 如何在 mysql 视图中重用别名列?
- c# - 无法构建 docker 映像(ASP.NET Core)
- azure-devops - 如何仅在 Azure Devops 中的工作项评论中标记您的姓名时收到通知?
- c++ - 如何创建 Windows Visual Studios C++/CX NOT UWP?
- csv - 如何使用 apache nifi 将标题添加到 csv
- spring-batch - 我怎样才能在所有不同的批处理阶段实现抽象?