如何正确引发文件异常

时间:2019-05-20 16:23:01

标签: python python-3.x

我具有以下要求:

  1. 从目录中读取文件,由于目录中有很多文件,因此需要使用通配符搜索来查找文件。
  2. 如果文件模式不匹配,那么我需要引发一个异常。请查看下面的代码。我为例外而苦苦挣扎。

我可以使用fnmatch函数来搜索文件,但是如果文件不存在,那么我会遇到异常。如何添加例外?请查看readstatus()函数,如果没有文件,请帮助我如何添加异常逻辑。

import os
import sys
import boto3
from botocore.client import Config
import configparser
import re
import os.path
import glob
import aws_encryption_sdk
import fnmatch
## Initialize the Parameters
def initconfig(input):

    config = configparser.ConfigParser()
    config.read_file(open( 'CONFIG_AIRBILLING.conf'))
    print('Code Name is :'+ input)
    global REMOTE_DIR,ACCESS_KEY_ID,ACCESS_SECRET_KEY,BUCKET_NAME,TARGET_DIR,FILENAME,SRC_DIR,FILEPATH
    ACCESS_KEY_ID = config.get('ACCESS', 'ACCESS_KEY_ID')
    print('ACCESS_ID_IS:'+ ACCESS_KEY_ID)
    ACCESS_SECRET_KEY = config.get('ACCESS', 'ACCESS_SECRET_KEY')
    BUCKET_NAME = config.get('ACCESS', 'BUCKET_NAME')
    SRC_DIR = config.get(input, 'SRC_DIR')
    FILENAME = config.get(input, 'FILENAME')
   # FILENAME=FILENAME+'*.txt'
    FILEPATH=SRC_DIR+'\\'+FILENAME
    print('File Path is:'+FILEPATH)
    TARGET_DIR = config.get(input, 'TARGET_DIR')


## This function will make sure file exist in Source directory
def readstatus():


      for file in os.listdir(SRC_DIR):
        if fnmatch.fnmatch(file,FILENAME+'*.txt'):
            result='True'
            print('****'+file)
            movefiles(file)



## This function will move the files to AWS S3 bucket
def movefiles(result):

    s3 = boto3.resource(
        's3',
        aws_access_key_id=ACCESS_KEY_ID,
        aws_secret_access_key=ACCESS_SECRET_KEY,
        config=Config(signature_version='s3v4')
    )
    s3.Bucket(BUCKET_NAME).put_object(Key=TARGET_DIR + '/' + result, Body=result)
    print('***File Moved***')


if __name__ == '__main__':
    initconfig(sys.argv[1])
    readstatus()

3 个答案:

答案 0 :(得分:1)

怎么样呢?

下面的代码段使用SRC_DIR和模式过滤fnmatch中的文件列表,并返回列表。然后,它检查列表是否为空,即未找到与模式匹配的文件,并引发Exception。否则,它将继续处理单个文件。

def readstatus():
  files = list(filter(lambda f: fnmatch.fnmatch(f, FILENAME+"*.txt"), os.listdir(SRC_DIR)))
  if not files:
    raise Exception("Files matching pattern not found!")
  for file in files:
    print(f"***{file}")
    movefiles(file)

如果找不到该文件,则可能会出现类似

的错误
Traceback (most recent call last):
  File "main.py", line 20, in <module>
    readstatus()
  File "main.py", line 10, in readstatus
    raise Exception("Files matching pattern not found!")
Exception: Files matching pattern not found!

答案 1 :(得分:0)

尝试:

def readstatus():
    result = False
    for file in os.listdir(SRC_DIR):
        if fnmatch.fnmatch(file, FILENAME + '*.txt'):
            result = True
            print('****' + file)
            movefiles(file)

    if result != True:
        print("your file doesn't exist")
        #add exception logic here

逻辑是,如果文件与给定的文件名匹配,则结果变量将为True,否则result变量将为False

我们使用变量result的值作为文件是否存在的校验和。

答案 2 :(得分:0)

如果您使用的是Python 3.4+,请考虑使用pathlib来简化许多麻烦事。

count = 0 
def Pascal(n):
    global count
    count += 1 
    pasc_list = [] 
    i = 0 
    j = i+1
    dictionary = {0:[1],1:[1,1]}

    if n in dictionary:
        return dictionary[n]
    else:
        pasc_list.append(1)
        while j < len(Pascal(n-1)):
            pasc_list.append(Pascal(n-1)[i] + Pascal(n-1)[j])
            i += 1 
            j = i + 1 
        pasc_list.append(1)
        dictionary[n] = pasc_list
    return pasc_list
a = Pascal(5)
print(a)
print(count)