簡體   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