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