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

时间:2018-07-20 14:46:04

标签: python

我正在尝试运行一个可以从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)

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

3 个答案:

答案 0 :(得分:2)

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

例如:

.container {
  display:flex
  flex-flow: row nowrap;
  flex-direction:row;
  justify-content: space-between;
}

.child {
  flex:1 50%;
}

答案 1 :(得分:2)

您可以使用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')])

答案 2 :(得分:0)

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

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)

说明:

过滤器采用一个可写的(这里是阅读器),并将应用于您给他的lambda的可写的每个元素,并将返回一个新列表“已过滤”。如果lambda返回True,则该元素将在过滤后的列表中返回。

lambda本质上是一种矮人功能(更明智的做法是,书呆子的人会因为简化而纠正我,但您会明白这一点),它返回您给他的唯一一行。

因此,我的lambda只是执行“ selected_details in x”操作,如果selected_details位于x中,则返回True,否则返回False。