【问题标题】:How do I prevent my script from crashing if condition is not met?如果不满足条件,如何防止我的脚本崩溃?
【发布时间】:2019-11-14 22:37:39
【问题描述】:

我正在尝试构建一个脚本,该脚本从一堆 .txt 中获取某些信息并将它们附加到 csv 中。 .txt 文件正在处理来自软件的日志。我运行的每个项目都会生成一个日志,我需要获取信息来构建月度报告。

我所拥有的:一个脚本,它遍历文件夹中的每一个日志,找到字符串片段(我需要的信息),并将它们放入一个新的 csv 文件中。如果 .txts 中的所有条件都满足,它就可以工作。

我遇到的问题:如果其中一个 .txt 文件不符合脚本要求(即:没有我要查找的字符串),脚本将停止运行并返回错误。

当然有更有效的方法可以做到这一点,但这是我目前所拥有的:

import re
import os.path, sys
import csv

path = r"C:\Users\r o d r i g o\Desktop\001 - progamer\python\03 - logpix\relatorios" 
dirs = os.listdir(path)

relatorio =  open(r'C:\Users\r o d r i g o\Desktop\001 - progamer\python\03 - logpix\relatorios\relatorio.csv', 'w')
writer = csv.writer(relatorio)
writer.writerow(['log', 'Nome', 'Projeção', 'Câmera', 'Número de fotos', 'Image Scale', 'Point Density', 'Min Number Matches', 'Step 1', 'Step 2'])

在上面,我定义了路径(我的 .txt 文件所在的位置)并编写了我的 csv 文件的第一行

def script():
    for item in dirs:
        fullpath = os.path.join(path,item)
        if fullpath.endswith(".txt"):
            logpix = open(fullpath)
            head, tail = os.path.split(fullpath)
            x = logpix.read()

            m_name = re.search('Name                    = <(.*)>', x)
            m_proj = re.search('WKT Output              = <PROJCS(.*),GEOGCS', x)
            m_cammodel = re.search('camera model <(.*)(RGB)', x)
            m_numimg = re.search('Cameras with (.*) different images', x)
            m_imscale = re.search('Image scale               = <(.*)>', x)
            m_ptdens = re.search('Point density             = <(.*)>', x)
            m_match = re.search('Minimum number of matches = <(.*)>', x)
            m_step1 = re.search('Step1<<< done in (.*)ms', x)
            m_step2 = re.search('Step2<<< done in (.*)ms', x)

            name = m_name.group(1)
            proj = m_proj.group(1)
            cammodel = m_cammodel.group(1)
            numimg = m_numimg.group(1)
            imscale = m_imscale.group(1)
            ptdens = m_ptdens.group(1)
            match = m_match.group(1)
            step1 = m_step1.group(1)
            step2 = m_step2.group(1)


            writer.writerow([tail, name, proj, cammodel, numimg, imscale, ptdens, match, step1, step2])

script()

relatorio.close()

上面,我用os循环遍历每个.txt文件;然后使用 re.search 查找我需要的信息;创建变量以将其转换为字符串;将这些变量写入 csv。

问题是,某些 .txt 文件可能没有我正在创建的变量之一(例如,没有第 2 步,或者没有相机模型)。如果是这种情况,我的 csv 会显示为空白,并且会收到一条错误消息:

 in script()
     29             name = m_name.group(1)
     30             proj = m_proj.group(1)
---> 31             cammodel = m_cammodel.group(1)
     32             numimg = m_numimg.group(1)
     33             imscale = m_imscale.group(1)

AttributeError: 'NoneType' object has no attribute 'group'

在此示例中,其中一个文件没有相机型号。

如果找不到变量,我如何告诉我的程序忽略它?还是填写 N/A?

我尝试过一些 if-else,但我不知道该放在哪里。任何帮助都非常感谢,即使只是为了将我推向正确的方向。

【问题讨论】:

  • 您需要检查所有re.search() 调用的结果,以确保它们成功。
  • if m_name and m_proj and ...:
  • 可能有点矫枉过正,但通常使用的 Python 结构是 try/except[/else/finally] 块。我认为@Barmar 评论中的方法是解决您可能丢失数据的问题的正确方法。

标签: python loops file match


【解决方案1】:

由于re.search 在未找到匹配项时返回None,您可以简单地这样做:

cammodel = m_cammodel and m_cammodel.group(1)

这样当m_cammodelNone 时,cammodel 将被分配None

【讨论】:

  • 哈,这就是我每天都更喜欢编码的原因。简单但很好,它有效。我现在会使用它,但我肯定会尝试其他遮阳篷,以防我再次遇到类似的问题(毕竟我必须在某个时候学习它)。谢谢!
【解决方案2】:

将以下内容视为伪代码。你也可以使用 try-catch 而不是 if 语句,因为 Python 中的异常很便宜:

def main():

    # ...

    from pathlib import Path

    for path in Path("path/to/textfiles").rglob("*.txt"):
        patterns = {
            "name": "Name: <(.*)>",
            "age": "Age: (.*)",
            "foo": "FooMeter: (\d+)"
        }

        with path.open("r") as file:
            content = file.read()
            row = []
            for key, pattern in patterns.items():
                match = re.search(pattern, content)
                if match is None:
                    row.append("")
                else:
                    row.append(match.group(1))

            writer.writerow(row)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    相关资源
    最近更新 更多