繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM