【问题标题】:Python re.search anomalyPython研究异常
【发布时间】:2016-12-13 20:18:51
【问题描述】:

我有一个例程搜索文件目录并从文件名中提取客户编号:

import os
import re

suffix= '.csv'

# For each file in input folder, extract customer number 
input_list = os.listdir(path_in)
for input_file in input_list:
        fileInput = os.path.join(path_in,input_file)
        customer_ID = re.search('custID_(.+?)'+suffix,fileInput).group(1)
        print(customer_ID)

suffix='.csv' 和一个装满 csv 文件的文件夹:

avg_hrly_custID_8147611.csv、avg_hrly_custID_8147612.csv、avg_hrly_custID_8147613.csv ...

我得到了预期的输出:

8147611, 8147612, 8147613...

但是,suffix = '.png' 和一个 .png 图像文件的文件夹:

yearly_average_plot_custID_8147611.png, yearly_average_plot_custID_8147612.png, yearly_average_plot_custID_8147613.png ...

我收到此错误:

AttributeError: 'NoneType' 对象没有属性 'group'

为什么它不适用于图像文件?

【问题讨论】:

  • 虽然我不明白为什么它会以一种方式而不是另一种方式工作(在 regex101.com/r/zT7rJ7/1 上它们的行为相同),但您可能想要匹配 \.csv\.png 而不是.csv.png 只是为了安全起见。
  • 您是否尝试打印出fileInput 字符串以确保您在正确的目录中?
  • 如果目录中有一个文件名不匹配,您的正则表达式将失败。你确定每个文件都匹配正则表达式吗?
  • 感谢@BrenBarn。目录中有两个子文件夹,这导致了问题。我怎样才能阻止它失败 - 即忽略任何不匹配?
  • 最直接的方法是将re_search的结果赋值给一个变量,例如match,然后测试if match:。当re_search 找到匹配项时,它将返回一个匹配实例,测试为 True;如果没有,它将返回 None,测试为 False。

标签: python search substring


【解决方案1】:

@BrenBarn 发现了问题的原因。正则表达式失败,因为目录中有一个名称不匹配的子目录。我通过介绍try....except解决了它

import os
import re

suffix= '.png'

# For each file in input folder, extract customer number 
input_list = os.listdir(path_in)
for input_file in input_list:
        fileInput = os.path.join(path_in,input_file)
        try:
           customer_ID = re.search('custID_(.+?)'+suffix,fileInput).group(1)
           print(customer_ID)
        except:
           pass

【讨论】:

  • Bare except 是一种糟糕的错误处理方式,当行为是忽略它时更糟糕;您现在要屏蔽所有可能的异常,而不仅仅是一个已知异常中的 AttributeError。分配search 的结果(例如,分配给名为match 的变量)并仅运行if match is not None: 是最安全的,否则,至少使用except AttributeError:,这样您就不会默默地忽略KeyboardInterrupt、@ 之类的东西987654330@等
猜你喜欢
  • 2015-09-09
  • 2013-12-26
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多