python - 程序在第一部分代码之后没有继续
问题描述
为什么下面的代码在“中断”后停止?如果我在'break' 之后插入一个打印语句,它将打印(例如打印“完成!”)。为什么它不会在'break'之后运行 with open..?它们各自独立工作(作为单独的 .py 文件)。
diskDetails = open("diskDetails.txt", "r")
data = open("data.txt", "w")
searchlines = diskDetails.readlines()
for i, line in enumerate(searchlines):
if "Failed" in line:
for l in searchlines[i-3:i+25]: print >> data, l
print
break
with open('data.txt') as infile, open('dataFinal.txt', 'w') as outfile:
for line in infile:
if line.startswith(("ID", "State", "Capacity", "Product ID", "----")):
outfile.write(line)
dataFinal.txt 文件是空白的,因此它似乎在“中断”之后停止。'break' 不只是停止'if' 循环吗?为什么它会打印“完成!” 但不是 'with open('data.txt').... 部分?
diskDetails.txt 包含几条记录,每条记录长 27 行(我已经为这个示例缩短了):
ID : 0:1:6
Status : Non-Critical
Name : Physical Disk 0:1:6
State : Failed
Power Status : Spun Up
Bus Protocol : SAS
Media : HDD
Part of Cache Pool : Not Applicable
Remaining Rated Write Endurance : Not Applicable
Failure Predicted : Yes
Revision : ES66
Driver Version : Not Applicable
Model Number : Not Applicable
T10 PI Capable : No
Certified : Yes
代码的第一部分获取包含'Failed'的记录(发现失败并返回上面的2行(i-3)和下面的25行(i+25),并将其输出到名为'data.txt'的文件中。
代码的第二部分(使用 open...)获取该 data.txt 文件,查找特定行(包含 ID、State、Capacity 等)并将其打印到名为 dataFinal.txt 的文件中
cat dataFinal.txt
ID : 0:1:6
State : Failed
Capacity : 558.38 GB (599550590976 bytes)
Product ID : ST3600057SS
代码的这两部分独立工作(如上所示)。如何让它们在同一个 .py 文件中一起工作?谢谢!
解决方案
好的,最后我将您的代码分为三个部分:
result = []
# 1. Search for the first failed entry:
with open('diskDetails.txt', 'r') as f:
lines = f.readlines()
for idx, line in enumerate(lines):
if ': Failed' in line:
result = lines[idx-3:idx+12] # save lines from 'ID' to 'Certified'
break # only the first match
# 2. Filter result:
keywords = ('ID', 'State', 'Capacity', 'Product ID')
result = list(filter(lambda l: str(l).startswith(keywords), result))
# 3. Save result:
with open('dataFinal.txt', 'wt') as f:
f.writelines(result)
# $ cat dataFinal.txt
# ID : 0:1:6
# State : Failed
推荐阅读
- c# - 如何获得输入错误而不是较小的输入字符串?
- c# - 具有相同脚本的 2 个对象中的 1 个会破坏 Unity
- javascript - 导航抽屉:使用意图导航活动,而不是片段
- oracle - ORA-31011: XML 解析在函数条件下失败
- node.js - 如何通过 Stripe 验证信用卡是否有效
- vue.js - 动态设置值 v-model 时未显示 md-input 值
- android - Android Gradle 移除传递依赖
- ruby-on-rails - 需要一个处理程序。传递 with: 关键字参数或提供一个块
- ios - UITableViewCell 浮动文本标签
- python - 如何通过python中特定值的特定索引对列表元素进行排序