2016-08-08 34 views
0

Ich habe eine Routine, die durch ein Verzeichnis von Dateien sucht und extrahiert eine Kundennummer aus dem Dateinamen:Python re.search Anomalie

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) 

Mit suffix='.csv' und einem Ordner voller csv-Dateien:

avg_hrly_custID_8147611.csv, avg_hrly_custID_8147612.csv, avg_hrly_custID_8147613.csv ...

ich die erwartete Ausgabe:

8147611, 8147612, 8147613...

ABER, mit suffix = '.png' und eine Falte er von .png Bilddateien ,:

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

ich diesen Fehler:

AttributeError: 'NoneType' object has no attribute 'group'

Warum wird es für die Bilddateien nicht?

+3

Obwohl ich sehe nicht, warum es eine Art und Weise funktionieren würde und nicht die andere (auf https://regex101.com/r/zT7rJ7/1 sie das gleiche tun verhalten), möchten Sie wahrscheinlich '\ .csv' und' \ .png' anstelle von '.csv' und' .png' anpassen, nur um auf der sicheren Seite zu sein. – DeepSpace

+1

Haben Sie versucht, die Zeichenfolge 'fileInput' auszudrucken, um sicherzustellen, dass Sie sich im richtigen Verzeichnis befinden? – Karin

+3

Ihre Regex schlägt fehl, wenn in dem Verzeichnis, dessen Name nicht übereinstimmt, nur eine Datei vorhanden ist. Sind Sie sicher, dass jede Datei mit der Regex übereinstimmt? – BrenBarn

Antwort

0

@BrenBarn erkannte die Ursache des Problems. Der Regex ist fehlgeschlagen, weil im Verzeichnis ein Unterverzeichnis vorhanden war, dessen Name nicht übereinstimmt. Ich habe es von 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 
Einführung gelöst
+0

Bare 'except' ist ein schrecklicher Weg, um Fehler zu behandeln, und es ist noch schlimmer, wenn das Verhalten es ignoriert; Sie maskieren jetzt jede mögliche Ausnahme, nicht nur den 'AttributeError' von der einen bekannten Ausnahme. Zuweisen des Ergebnisses von 'search' (sagen wir zu einer Variablen mit dem Namen' match') und nur ausführen 'falls Übereinstimmung nicht None:' ist am sichersten, wenn das nicht funktioniert, benutze 'except AttributeError:' damit du nicht stillschweigend ignorierst Sachen wie 'KeyboardInterrupt',' SystemExit' usw. – ShadowRanger