在Python中如何跳过单循环迭代的一部分

2024-10-01 00:25:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python循环的一次迭代中创建了大约200个变量(从excel文档中提取字段并将它们推送到SQL数据库中),我正试图找出一些问题。

假设一个迭代是一个Excel工作簿,我在一个目录中循环。我从每个工作簿中提取大约200个字段。

如果我提取其中一个字段(假设字段Š56/200)格式不正确(假设日期填写错误,即2015年9月31日,这不是一个真正的日期),它与我正在执行的操作出错。

我希望循环跳过该变量并继续创建变量#57。我不希望循环完全转到下一个迭代或工作簿,我只希望它忽略该变量上的错误,并继续使用该单个循环迭代的其余变量。

我该怎么做这样的事呢?

在这个示例代码中,我希望继续提取“PolicyState”,即使ExpirationDate有错误。

一些示例代码:

import datetime as dt
import os as os
import xlrd as rd

files = os.listdir(path)

for file in files: #Loop through all files in path directory  
            filename = os.fsdecode(file) 
            if filename.startswith('~'): 
                continue

            elif filename.endswith( ('.xlsx', '.xlsm') ): 
                try:
                    book = rd.open_workbook(os.path.join(path,file)) 
                except KeyError:
                    print ("Error opening file for "+ file) 
                    continue

                    SoldModelInfo=book.sheet_by_name("SoldModelInfo")
                    AccountName=str(SoldModelInfo.cell(1,5).value)
                    ExpirationDate=dt.datetime.strftime(xldate_to_datetime(SoldModelInfo.cell(1,7).value),'%Y-%m-%d')
                    PolicyState=str(SoldModelInfo.cell(1,6).value)
                    print("Insert data of " + file +" was successful")
            else:
               continue               

Tags: path代码import示例datetimevalueosas
3条回答

正如建议的那样,您可以在每个extract变量上使用多个try块,也可以使用自己的自定义函数简化它,该函数为您处理try

from functools import reduce, partial

def try_funcs(cell, default, funcs):
    try:
        return reduce(lambda val, func: func(val), funcs, cell)
    except Exception as e:
        # do something with your Exception if necessary, like logging.
        return default

# Usage:

AccountName = try_funcs(SoldModelInfo.cell(1,5).value, "some default str value", str)
ExpirationDate = try_funcs(SoldModelInfo.cell(1,7).value), "some default date", [xldate_to_datetime, partial(dt.datetime.strftime, '%Y-%m-%d')])
PolicyState = try_funcs(SoldModelInfo.cell(1,6).value, "some default str value", str)

这里我们使用^{}重复多个函数,并将^{}作为带参数的冻结函数传递。在

这可以帮助您的代码看起来整洁,而不会让大量的try块弄乱。但是,更好、更明确的方法是处理您预期可能会出错的字段。在

使用多个try块。将每个可能出错的解码操作包装在自己的try块中,以捕获异常,执行某些操作,然后继续下一个操作。在

            try:
                book = rd.open_workbook(os.path.join(path,file)) 
            except KeyError:
                print ("Error opening file for "+ file) 
                continue

            errors = []

            SoldModelInfo=book.sheet_by_name("SoldModelInfo")
            AccountName=str(SoldModelInfo.cell(1,5).value)
            try:
                ExpirationDate=dt.datetime.strftime(xldate_to_datetime(SoldModelInfo.cell(1,7).value),'%Y-%m-%d')
            except WhateverError as e:
                # do something, maybe set a default date?
                ExpirationDate = default_date
                # and/or record that it went wrong?
                errors.append( [ "ExpirationDate", e ])
            PolicyState=str(SoldModelInfo.cell(1,6).value)
            ...
            # at the end
            if not errors:
                print("Insert data of " + file +" was successful")
            else:
                # things went wrong somewhere above. 
                # the contents of errors will let you work out what

所以,基本上你需要把你的xldate_to_datetime()调用包装成try ... except

import datetime as dt

v = SoldModelInfo.cell(1,7).value

try:
    d = dt.datetime.strftime(xldate_to_datetime(v), '%Y-%m-%d')
except TypeError as e:
    print('Could not parse "{}": {}'.format(v, e)

相关问题 更多 >