Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3-x使用类似SQL的条件从CSV表中选择一列和一行_Python_Sql_Python 3.x_Csv - Fatal编程技术网

Python3-x使用类似SQL的条件从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

这是一个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
)您可以使用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'][[姓名])已清理,感谢您在面向公众的代码中捕捉到这一点!