[英]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
索引等于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')])
过滤器应该可以解决问题,例如
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.