【问题标题】:Searching for specific word and returning specific lines搜索特定单词并返回特定行
【发布时间】:2019-02-05 05:03:55
【问题描述】:

我得到了以下代码的帮助,但需要知道如何让它为所有匹配项执行此操作。

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+25]  # save lines from 'ID' to 'Sub Vendor'
            #break  # only the first match

# 2. Filter result:
keywords = ('ID', 'State', 'Capacity', 'Product ID', 'Serial No.')
result = list(filter(lambda l: str(l).startswith(keywords), result))

# 3. Save result:
with open('dataFinal.txt', 'wt') as f:
    f.writelines(result)

因此,如果我取消注释“中断”,它只会显示第一个(如上所述) (输出)

ID                              : 0:1:2
State                           : Failed
Capacity                        : 558.38 GB (599550590976 bytes)
Product ID                      : ST3600057SS
Serial No.                      : 6SL7YFWF

如果我注释掉,它只会在第一个之后显示匹配。 (输出)

ID                              : 0:1:5
State                           : Failed
Capacity                        : 558.38 GB (599550590976 bytes)
Product ID                      : ST3600057SS
Serial No.                      : 6SLAWWHQ

如何让它返回文件中的所有匹配项(以上两个输出)?

diskDetails.txt 示例。该文件可能包含 4-8 个部分,如下所示。我没有包括每个部分的每一行(以 ID 开头),因为每个部分有 28 行长。假设关键字在每个部分中。此外,每个部分都由一个空行分隔(如果有帮助的话)。

ID                              : 0:1:0
Status                          : Ok
Name                            : Physical Disk 0:1:0
State                           : Online
Power Status                    : Spun Up
Bus Protocol                    : SAS
Media                           : HDD
Part of Cache Pool              : Not Applicable
Remaining Rated Write Endurance : Not Applicable
Failure Predicted               : No
Revision                        : ES66
Driver Version                  : Not Applicable
Model Number                    : Not Applicable
T10 PI Capable                  : No
Certified                       : Yes
Encryption Capable              : No
Encrypted                       : Not Applicable
Progress                        : Not Applicable
Mirror Set ID                   : 0
Capacity                        : 558.38 GB (599550590976 bytes)
Used RAID Disk Space            : 558.38 GB (599550590976 bytes)

ID                              : 0:1:1
Status                          : Ok
Name                            : Physical Disk 0:1:0
State                           : Online
Power Status                    : Spun Up
Bus Protocol                    : SAS
Media                           : HDD
Part of Cache Pool              : Not Applicable
Remaining Rated Write Endurance : Not Applicable
Failure Predicted               : No
Revision                        : ES66
Driver Version                  : Not Applicable
Model Number                    : Not Applicable
T10 PI Capable                  : No
Certified                       : Yes
Encryption Capable              : No
Encrypted                       : Not Applicable
Progress                        : Not Applicable
Mirror Set ID                   : 0
Capacity                        : 558.38 GB (599550590976 bytes)
Used RAID Disk Space            : 558.38 GB (599550590976 bytes)

ID                              : 0:1:2
Status                          : Critical
Name                            : Physical Disk 0:1:2
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               : No
Revision                        : ES66
Driver Version                  : Not Applicable
Model Number                    : Not Applicable
T10 PI Capable                  : No
Certified                       : Yes
Encryption Capable              : No
Encrypted                       : Not Applicable
Progress                        : Not Applicable
Mirror Set ID                   : 0
Capacity                        : 558.38 GB (599550590976 bytes)

ID                              : 0:1:3
Status                          : Ok
Name                            : Physical Disk 0:1:3
State                           : Online
Power Status                    : Spun Up
Bus Protocol                    : SAS
Media                           : HDD
Part of Cache Pool              : Not Applicable
Remaining Rated Write Endurance : Not Applicable
Failure Predicted               : No
Revision                        : ES66
Driver Version                  : Not Applicable
Model Number                    : Not Applicable
T10 PI Capable                  : No
Certified                       : Yes
Encryption Capable              : No
Encrypted                       : Not Applicable
Progress                        : Not Applicable
Mirror Set ID                   : 0
Capacity                        : 558.38 GB (599550590976 bytes)
Used RAID Disk Space            : 558.38 GB (599550590976 bytes)

ID                              : 0:1:4
Status                          : Ok
Name                            : Physical Disk 0:1:4
State                           : Online
Power Status                    : Spun Up
Bus Protocol                    : SAS
Media                           : HDD
Part of Cache Pool              : Not Applicable
Remaining Rated Write Endurance : Not Applicable
Failure Predicted               : No
Revision                        : ES64
Driver Version                  : Not Applicable
Model Number                    : Not Applicable
T10 PI Capable                  : No
Certified                       : Yes
Encryption Capable              : No
Encrypted                       : Not Applicable
Progress                        : Not Applicable
Mirror Set ID                   : 0
Capacity                        : 558.38 GB (599550590976 bytes)
Used RAID Disk Space            : 558.38 GB (599550590976 bytes)

ID                              : 0:1:5
Status                          : Non-Critical
Name                            : Physical Disk 0:1:5
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
Encryption Capable              : No
Encrypted                       : Not Applicable
Progress                        : Not Applicable
Mirror Set ID                   : Not Applicable
Capacity                        : 558.38 GB (599550590976 bytes)
Used RAID Disk Space            : 558.38 GB (599550590976 bytes)

ID                              : 0:1:6
Status                          : Ok
Name                            : Physical Disk 0:1:6
State                           : Online
Power Status                    : Spun Up
Bus Protocol                    : SAS
Media                           : HDD
Part of Cache Pool              : Not Applicable
Remaining Rated Write Endurance : Not Applicable
Failure Predicted               : No
Revision                        : ES66
Driver Version                  : Not Applicable
Model Number                    : Not Applicable
T10 PI Capable                  : No
Certified                       : Yes
Encryption Capable              : No
Encrypted                       : Not Applicable
Progress                        : Not Applicable
Mirror Set ID                   : 0
Capacity                        : 558.38 GB (599550590976 bytes)
Used RAID Disk Space            : 558.38 GB (599550590976 bytes)

如何只输出和保存包含“失败”的部分,并且只包含包含每个部分关键字的行?

【问题讨论】:

    标签: python lambda readlines


    【解决方案1】:

    更改 #1:将结果附加到列表中。在您重新分配每个循环之前

    if ': Failed' in line:
        result.append(lines[idx-3:idx+25])
    

    更改 #2:更新我们的过滤器逻辑以循环结果,因为它现在是一个列表列表

    results = list(filter(lambda l: str(l).startswith(keywords), r) for r in result)
    

    更改 #3:循环遍历结果并写入文件

    with open('dataFinal.txt', 'wt') as f:
        for result in results:
            f.writelines(result)
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢你!我会尝试更好地解决这个问题。成功了!
    • 对于其他阅读者,我注释掉了“中断”。再次感谢 cullzie,我在任何地方都找不到这个确切的场景,而且我是新手。 xD
    【解决方案2】:

    您使用“result = []”行创建了一个空列表,这很好。

    您重新定义列表“结果”,每次通过 for 循环的行: 结果 = 行[idx-3:idx+25]

    您想在 for 循环中添加“结果”列表,例如: 结果.append(行[idx-3:idx+25])

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 2021-05-22
      相关资源
      最近更新 更多