如果不满足条件,如何防止脚本崩溃?

我正在尝试构建一个脚本,该脚本从一堆.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,但我不知道该放在哪里。非常感谢您提供任何帮助,即使只是向正确的方向轻推我。

y5123768 回答:如果不满足条件,如何防止脚本崩溃?

将以下内容视为伪代码。您也可以使用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)
,

由于没有找到匹配项时,re.search返回了None,因此您只需执行以下操作:

cammodel = m_cammodel and m_cammodel.group(1)

以便在cammodelNone时为m_cammodel分配None

本文链接:https://www.f2er.com/3098928.html

大家都在问