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