从文件指针读取文件而不使用读线

2024-06-16 08:43:49 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能帮我修复这个代码吗?我一直在犯这个错误,我很挣扎

对于我练习的每一个代码,我总是得到相同的错误

这是我们应该处理的这个问题的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','Weilin','Zhao','450.25','1998-01-03']

这就是我一直在下面记录的错误

测试对禁用Python函数的调用:“readlines”

错误:

函数不应调用“readlines”

以下是我在代码中测试的所有内容:

测试各种参数:“客户文件变量”

测试对禁用Python函数的调用:“输入”

测试对禁用Python函数的调用:“print”

测试对禁用Python函数的调用:“readlines”

错误:

函数不应调用“readlines”

测试对禁用Python函数的调用:“打开”

测试对禁用Python函数的调用:“close”

测试函数docstring文档:

多重回报测试:

测试函数是否未使用“for”:

测试函数是否不硬编码文件长度:

测试是否滥用函数名:


Tags: 文件函数代码none客户错误linerecord
2条回答

如果您确实不能使用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']
 

作为使用.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()通常不是坏的做法,你也不应该把这项作业当作今后避免做这些事情的标志。如果作业没有告诉你应该使用什么工具,而你最近在课堂上的讲座也没有涵盖上述任何一项,目的是给你提供线索,那么我认为这是一项糟糕的作业

此外,您的代码可能存在逻辑错误(请尝试record == None and values[4] < record[4]),但这不是您要问的问题,一旦评分系统开始实际运行您的代码,您将收到不同的错误消息,这些消息可能会引导您找到答案

相关问题 更多 >