[英]read file from file pointer without using readlines
有人可以帮我修复这个代码我一直收到这个错误,我很挣扎。
对于我练习的每一个代码,我都会遇到同样的错误
这是我们应该处理的这个问题的customers.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
def customer_first(fh):
record = None
lines = fh.readlines()
i = 0
while i < len(lines):
line = lines[i]
values = line.rstrip('\n').split(',')
if record == None or values[4] < record[4]:
record = values
i += 1
return record
...
样品测试:
查找最早登录的客户:
['43564', '伟林', '赵', '450.25', '1998-01-03']
这是我不断下降的错误。
测试对禁止 Python 函数的调用:'readlines'
错误:
function 不应调用“readlines”
这些是我在代码中测试的所有内容:
测试各种参数:'客户文件变量'
好的
测试对禁止 Python 函数的调用:“输入”
好的
测试对禁止 Python 函数的调用:“打印”
好的
测试对禁止 Python 函数的调用:'readlines'
错误:
function 不应调用“readlines”
测试对禁止 Python 函数的调用:'open'
好的
测试对禁止 Python 函数的调用:“关闭”
好的
测试 function 文档字符串文档:
好的
测试多重回报:
好的
测试 function 不使用“for”:
好的
测试 function 没有硬编码文件的长度:
好的
测试误用 function 名称:
好的
作为使用.readlines
() 的替代方法,您的评分系统可能会期望这样做:
def customer_first(fh):
record = None
lines = fh.read().split('\n')
i = 0
while i < len(lines):
line = lines[i]
values = line.split(',')
if record == None or values[4] < record[4]:
record = values
i += 1
return record
在这里,我们调用.read()
一次读取整个文件,然后.split()
将每个换行符分成单独的行。 这本质上是.readlines()
可能在幕后所做的,并且是不使用该方法的代码的最直接替代品。
您的评分系统也可能希望您这样做:
def customer_first(fh):
record = None
i = 0
line = fh.readline()
while line != '':
values = line.rstrip('\n').split(',')
if record == None or values[4] < record[4]:
record = values
line = fh.readline()
return record
File.readline()
与File.readlines()
() 类似,只是它只返回一行,如果到达文件末尾则返回一个空字符串。
另一种替代解决方案是使用next()
遍历文件,并使用try
/ except
块来捕获StopIteration
(这就是for
循环在后台实际工作的方式)。 不过,这是一种更复杂、更先进、更小众的方法,我认为你的老师不太可能希望你在这里使用它,除非这是你刚刚学到的东西:
def customer_first(fh):
record = None
i = 0
try:
line = next(fh)
while line != '':
values = line.rstrip('\n').split(',')
if record == None or values[4] < record[4]:
record = values
line = next(fh)
except StopIteration
return record
我想给你留下深刻印象的是,在可能的情况下使用for
循环通常是一种好习惯,当简单地在for
循环中迭代文件是不够的时,使用.readlines()
通常通常不是坏习惯,你应该'不要把这个任务作为一个标志,以避免将来做这些事情。 如果作业没有告诉你应该使用什么工具,并且你最近在 class 上的讲座没有涵盖上述内容之一,旨在让你了解它,那么我认为这是一个错误的分配。
此外,您的代码可能存在逻辑错误(尝试record == None and values[4] < record[4]
),但这不是您要问的问题,一旦评分系统开始实际运行您的代码,您' 会收到不同的错误消息,这些错误消息可能会导致您无论如何都要弄清楚。
如果您真的不能使用 readlines()或 csv 模块,那么您当然可以遍历文件,例如:
data=[line.split(',') for line in fh.read().splitlines()]
>>> data
[['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']]
由于这些是ISO 8601样式的日期,因此不需要从文本转换。 您可以通过以下方式获得min
:
>>> min(data, key=lambda sl: sl[4])
['43564', 'Weilin', 'Zhao', '450.25', '1998-01-03']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.