Python3-x使用类似SQL的条件从CSV表中选择一列和一行
这是一个CSV文件Python3-x使用类似SQL的条件从CSV表中选择一列和一行,python,sql,python-3.x,csv,Python,Sql,Python 3.x,Csv,这是一个CSV文件kidsList.CSV,以逗号分隔,第一行是标题。第一列Id是唯一的,因此可以将其用作主键 Id,Name,Age A1,Alice,6 A2,Becca,5 B1,Cindy,7 身份证、姓名、年龄 艾丽丝,6岁 2号,贝卡,5号 B1,辛迪,7岁 现在我想找到Id为A2的名称;答案应该是“贝卡” 在SQL中,它类似于从Id=“A2”的表中选择名称 在Python3.x中如何实现这一点?此操作非常简单,我想使用标准库(如csv)而不是非标准库(如pandas)您可以使用cs
kidsList.CSV
,以逗号分隔,第一行是标题。第一列Id是唯一的,因此可以将其用作主键
Id,Name,Age
A1,Alice,6
A2,Becca,5
B1,Cindy,7
身份证、姓名、年龄
艾丽丝,6岁
2号,贝卡,5号
B1,辛迪,7岁
现在我想找到Id为A2的名称;答案应该是“贝卡”
在SQL中,它类似于从Id=“A2”的表中选择名称
在Python3.x中如何实现这一点?此操作非常简单,我想使用标准库(如
csv
)而不是非标准库(如pandas
)您可以使用csv库将csv文件转换为二维列表,然后在阵列中循环:
import csv
key = 'A2'
category = 'Name'
with open('kidsList.csv', 'r') as file:
contents = list(csv.reader(file))
index = contents[0].index(category)
for i in range(1, len(contents)):
if contents[i][0] == key:
print(contents[i][index])
break
我认为该类可用于创建字典映射,您可以通过Id列的值对其进行索引:
import csv
from collections import OrderedDict
kids = OrderedDict()
_name = 0
_age = 1
with open('kidsList.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile, fieldnames=("Id",),restkey="data_list")
for row in reader:
kids[row["Id"]] = row["data_list"]
print(f"ID = A1 has data: name= {kids['A1'][_name]}, age= {kids['A1'][_age]} ")
# Expected Output:
# ID = A1 has data: name= Alice, age= 6
不,我不是这个意思。我想在不知道行数的情况下找到使用条件的单元格。在本例中,“Becca”位于第二行,但假设CSV文件较长,您希望从表中选择名称,其中Id=“C1”。您是否仅通过Id值对数据进行索引?是的。请注意,与键值对(例如dictionary、JSON)不同,它有3+列。@Culip抱歉,我没有完全理解您的问题,我编辑了我的答案以更好地解决它,我得到了“Indexer:字符串索引超出范围”。嘿,我添加了一个答案,将从csv.DictReader创建OrderedDict。请检查一下!如果您了解SQL,可以检查“dataset”包,以便轻松地从CSV-->SQLite转到。如果Id是键,我建议您按Id索引数据,并保留索引中的行(值)引用。您可以为每个键列创建索引。索引可以存储在地图数据结构中。对于非索引列搜索,它将是一个完整的表扫描(遍历所有行)。现在,要支持类似SQL的语法,如果您希望使用类似的语法,您可能需要编写解释器。令人惊讶的是,我们无法仅使用CSV模块%-/Yah来完成这样的基本SQL任务,而恰恰是为了获得“Name”值。很高兴这对你有用!您可以尝试类似于
\u name=0_年龄=1岁;印刷品(儿童['A2'][[姓名])代码>已清理,感谢您在面向公众的代码中捕捉到这一点!