python - 将文件中的行放入多个变量中会产生奇怪的不一致
问题描述
在我尝试解释这一点之前,这是我目前正在使用的代码:
currentLine = 1
try:
with open(filename, 'r') as f:
for line in f:
if currentLine == 1:
tempName = line
if currentLine == 2:
tempColour = line
if currentLine == 3:
tempAge = line
if currentLine == 4:
tempWeight = line
currentLine = 1
tempSheep = Sheep(tempName, tempColour, tempAge, tempWeight)
sheepList.append(tempSheep)
currentLine = currentLine + 1
except:
print("file is in an invalid format")
continue
else:
break
代码的目标是从文件中读取 4 行(名称、颜色、年龄和体重)并将它们放入 Sheep 对象中。这需要循环完成,因为每个文件有 2 到 10 只羊。该代码主要工作,因为它读取行并将它们放入类中,但它没有读取正确的行。当我打印出所有的羊时,每只羊的名字都一样,“bob”,这是文件中第一只羊的名字,也是第一行。除此之外,它确实有效,但它完全忽略了 name 变量,只是将 bob 放入其中。我最终得到了这群名叫鲍勃的羊。
例如,示例输出如下所示:
Name: bob
Colour: blue
age: 5
weight: 50
name: bob
Colour: tina
age: red
Weight: 7
name: bob
colour: 75
age: shirley
Weight: green
如果它不明显,它会通过忽略名称来抵消一切。我希望这已经解释得足够好,如果您需要进一步的解释,我可以尝试放入更多示例。
为什么我的程序不好?
解决方案
if currentLine == 4:
tempWeight = line
currentLine = 1
tempSheep = Sheep(tempName, tempColour, tempAge, tempWeight)
sheepList.append(tempSheep)
currentLine = currentLine + 1
当此if
块执行时,它最初设置currentLine
为 1。然后currentLine = currentLine + 1
执行,将其设置为 2。这意味着,当您再次到达循环顶部时,if currentLine == 1:
检查将永远不会成功。
尝试设置currentLine
为零。
if currentLine == 4:
tempWeight = line
currentLine = 0
tempSheep = Sheep(tempName, tempColour, tempAge, tempWeight)
sheepList.append(tempSheep)
currentLine = currentLine + 1
...但是您最好完全跳过 if 块。如果您的每条记录正好有四行长,您可以使用如何将列表拆分为大小均匀的块?. 然后,您可以通过参数解包将数据传递给 Sheep 构造函数。
def chunks(l, n):
"""Yield successive n-sized chunks from l."""
for i in range(0, len(l), n):
yield l[i:i + n]
with open(filename) as f:
lines = [line.strip() for line in f]
sheepList = []
for group in chunks(lines, 4):
sheepList.append(Sheep(*group))
推荐阅读
- python - Windows 安装程序必须写入注册表(使用 NSIS 安装的已编译 python 应用程序)
- node.js - Azure 管道中的 UI 测试显示错误找不到使用节点 js 的 chrome 二进制文件
- android - Admob 在 Android 应用程序中导致 NullPointerException
- javascript - 从父组件访问子组件引用
- processing - 转换为字符串的整数不能按预期工作
- django - 使用页码重定向回列表视图
- gf - 在 GF 中生成所有属格
- node.js - 为新手解释异步等待代码块。为什么 user.password_hash 为空?
- kubernetes - 在部署 Kubernetes 资源时更改 Pulumi 的超时时间
- swiftui - 我们如何在 SwiftUI 中安全地解包数据?