繁体   English   中英

如何从 csv 文件中读取特定行的数据?

[英]How to read a specific line of data from a csv file?

我正在尝试运行一个可以从 python 中的 csv 文件读取特定数据行的代码。

import csv
with open('details.csv', 'rt') as f:
    reader = csv.reader(f)
    selected_details = input("Enter student ID for details:\n")
    for selected_details in reader:
        print(reader)

我如何接受输入然后使用它来选择和打印该特定行?

您可以遍历每一行并检查用户输入的数据是否一致。

前任:

import csv

selected_details = input("Enter student ID for details:\n")
with open('details.csv', 'rt') as f:
    reader = csv.reader(f)
    for line in reader:
        if selected_details in line:
            print(reader)
            break

您可以使用带有默认值的next

如果未找到,这将返回idx索引等于valueNone的第一行:

import csv


def find_by_position(filename, idx, value):
    with open(filename) as f:
        reader = csv.reader(f)
        row = next((item for item in reader if item[idx] == value), None)

    return row

示例用法:

>>> # `data/data.csv` looks like this:
... # 
... # id,name,score
... # 1,bla,65
... # 5,another name,95
... # 9,test,95
...
>>> find_by_position('data/data.csv', 0, '5')
['5', 'another name', '95']
>>> find_by_position('data/data.csv', 1, 'bla')
['1', 'bla', '65']

更具描述性的方法是使用csv.DictReader以便我们可以根据列名进行搜索:

import csv


def find_by_column(filename, column, value):
    with open(filename) as f:
        reader = csv.DictReader(f)
        row = next((item for item in reader if item[column] == value), None)

    return row

用法与之前的方法非常相似:

>>> # `data/data.csv` looks like this:
... # 
... # id,name,score
... # 1,bla,65
... # 5,another name,95
... # 9,test,95
...
>>> find_by_column('data/data.csv', 'id', '5')
OrderedDict([('id', '5'), ('name', 'another name'), ('score', '95')])
>>> find_by_column('data/data.csv', 'name', 'bla')
OrderedDict([('id', '1'), ('name', 'bla'), ('score', '65')])

过滤器应该可以解决问题,例如

import csv
with open('details.csv', 'rt') as f:
    reader = csv.reader(f)
    selected_details = input("Enter student ID for details:\n")
    results = filter(lambda x: selected_details in x, reader)
    for line in results:
        print(line)

解释:

Filter 接受一个 itterable(这里是 reader),并将应用你给他的 lambda 的 itterable 的每个元素,并将返回一个“过滤”的新列表。 如果 lambda 返回 True,则元素将在过滤后的列表中返回。

一个 lambda 基本上是一个侏儒函数(更聪明,更书呆子的人会在这个过度简化上纠正我,但你明白了)它返回你给他的唯一一行。

所以我的 lambda 只是执行“selected_details in x”操作,如果 selected_details 在 x 中,则返回 True,否则返回 False,你明白了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM