我试图设计一个基本上将文件变量作为参数的函数,并返回一个列表,其中包含文件中最早的帐户日期的客户数据。
假设这是文件(txt文件)的内容:
12345,Tom,Black,300.00,1998-01-30
23456,Alice,Smith,1200.50,1998-02-20
14567,Jane,White,900.00,1998-07-01
43564,Weilin,Zhao,450.25,1998-01-03
45432,Bina,Mehta,278.95,1998-03-21
我的代码是:
l = open(r'C:\Users\John\Downloads\customers.txt','r', encoding="utf-8")
contents= l.readlines()
def get_earliest_customer(contents):
with open(r'C:\Users\John\Downloads\customers.txt','r', encoding="utf-8") as f:
print(min(f, key=(lambda l: string(l.strip().split(",")[4]))))
l.close()
get_earliest_customer(contents)
哪个课程给了我更多的信息:
print(min(f, key=(lambda l: string(l.strip().split(",")[4]))))
File "C:\Users\John\Home\HPcomputers\src\4.py", line 10, in <lambda>
print(min(f, key=(lambda l: str(l.strip().split(",")[4]))))
NameError: name 'string' is not defined
对于解决这个问题,建议/意见表示赞赏,我已经指定了我想要搜索的点是[4],因为每行的日期都在那里。
答案 0 :(得分:1)
l = open(r'C:\Users\John\Downloads\customers.txt','r', encoding="utf-8")
contents= l.readlines()
def get_earliest_customer(contents):
with open(r'C:\Users\John\Downloads\customers.txt','r', encoding="utf-8") as f:
print(min(f, key=(lambda l: str(l.strip().split(",")[4]))))
l.close()
get_earliest_customer(contents)
给出输出:
43564,Weilin,Zhao,450.25,1998-01-03
这就是我想要的,因此从字符串到str的变化,虽然微小的变化提供了我想要的输出。
答案 1 :(得分:1)
试试这个:
file1 = open('data.txt', 'r')
print min([line for line in file1.read().splitlines()], key=lambda x: x.rsplit(',', 1)[1])
输出:
43564,Weilin,Zhao,450.25,1998-01-03
答案 2 :(得分:1)
更好的方法是将日期字符串转换为日期对象,然后进行比较。
我也不知道您为什么要两次阅读该文件,即使将其传递给您的函数,也不会使用contents
变量。
import datetime
import csv
fmt = '%Y-%m-%d'
def get_earliest_customer(filename):
contents = []
with open(filename) as f:
reader = csv.reader(contents, delimiter=',')
for row in reader:
contents = row[:-1]+[datetime.datetime.strptime(row[-1], fmt)]
return min(contents, key=lambda x: x[-1])
print(get_earliest_customer(r'C:\Users\John\Downloads\customers.txt'))