簡體   English   中英

如果不滿足條件,如何防止我的腳本崩潰?

[英]How do I prevent my script from crashing if condition is not met?

我正在嘗試構建一個腳本,從一堆.txts 和 append 中獲取某些信息到 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'])

上面,我定義路徑(my.txts 所在的位置)並寫下我的 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'

在此示例中,其中一個文件沒有相機 model。

如果找不到變量,我如何告訴我的程序忽略它? 還是用 N/A 填寫?

我試圖玩一些 if-else,但我不知道該放在哪里。 任何幫助都非常感謝,即使只是為了將我推向正確的方向。

考慮以下是偽代碼。 您還可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM