我正在尝试运行一个可以从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)
我如何接受输入,然后使用它来选择并打印该特定行?
答案 0 :(得分:2)
您可以遍历每行,并检查用户输入的数据是否在行中。
例如:
.container {
display:flex
flex-flow: row nowrap;
flex-direction:row;
justify-content: space-between;
}
.child {
flex:1 50%;
}
答案 1 :(得分:2)
您可以使用next
作为默认值。
这将返回第一行,其中idx
索引等于value
或None
(如果找不到):
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。