Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果条件不满足,如何防止脚本崩溃?_Python_Loops_File_Match - Fatal编程技术网

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

Python 如果条件不满足,如何防止脚本崩溃?,python,loops,file,match,Python,Loops,File,Match,我试图构建一个脚本,从一堆.txt中获取某些信息,并将它们附加到csv中。txt文件正在处理来自软件的日志。我运行的每个项目都会生成一个日志,我需要获取信息以建立月度报告 我所拥有的:一个脚本,它运行在文件夹中的每一个日志中,查找字符串片段(我需要的信息),并将它们放入一个新的csv中。如果满足.txts中的所有条件,则它可以工作 我的问题是:如果其中一个.txt不符合脚本要求(即:没有我要查找的字符串),脚本将停止运行并返回错误 当然,有更有效的方法可以做到这一点,但到目前为止,我已经做到了:

我试图构建一个脚本,从一堆.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'])
在上面,我定义了路径(my.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()

在本例中,其中一个文件没有相机模型

如果程序找不到某个变量,如何告诉程序忽略该变量?还是填写不适用


我试着玩一些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)
def main():
# ...
从pathlib导入路径
对于路径中的路径(“path/to/textfiles”).rglob(“*.txt”):
模式={
“名称”:“名称:”,
“年龄”:“年龄:(.*)”,
“foo”:“FooMeter:(\d+)
}
将path.open(“r”)作为文件:
content=file.read()
行=[]
对于键,patterns.items()中的pattern:
匹配=重新搜索(模式、内容)
如果匹配为“无”:
行。追加(“”)
其他:
行追加(匹配组(1))
writer.writerow(行)

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

cammodel = m_cammodel and m_cammodel.group(1)

因此,当
m_cammodel
None
时,
cammodel
将被分配
None

您需要检查所有
re.search()
调用的结果,以确保它们成功。
如果m_name和m_proj以及……:
可能是多余的,但通常使用的Python结构是
try/except[/else/finally]
块。我认为@Barmar评论中的方法是解决潜在数据丢失问题的正确方法。哈,这就是为什么我每天都更喜欢编码的原因。简单但很好,它是有效的。现在我将使用它,但我一定会尝试其他awnsers,以防我再次遇到类似的问题(毕竟我必须在某个时候学习它)。非常感谢。
cammodel = m_cammodel and m_cammodel.group(1)