Python读取Excel文件时出现错误-“我们发现了某些内容有问题...”

时间:2020-06-15 18:24:31

标签: python python-3.x excel

这是我的问题。我们有一个基于Excel的报告,业务用户可以在两个单独的字段中输入评论,还可以从下拉列表中选择代码。然后,我们有一个手动过程,可以收集这些文件,并将注释和代码推送到Snowflake表中,以便可以在各种报告中使用。

我正在尝试使用Python脚本来改进此过程,该脚本将收集文件,将它们复制到staging_folder位置,然后从工作表中读取数据,将其全部附加在一起,进行一些清理,然后推送到Snowflake。该计划是完全自动化的-但这是我们遇到问题的地方。

初始步骤非常有效。我有一个循环,可根据上一个工作日的日期获取文件,并将其复制到暂存文件夹中。通常每天有32个文件。

下一步将读取这些文件以附加到数据框。这是在我的Python脚本中加载Excel文件的函数。

def load_files():
file_list = glob.glob(file_path + r'\*')
df = pd.DataFrame()
print("Importing data to Pandas DF...")
for file in file_list:
    try:
        wb = load_workbook(file)
        ws = wb["Daily Outs"]
        data = ws.values
        cols = next(data)[1:]
        data = list(data)
        idx = [r[0] for r in data]
        data = (islice(r, 1, None) for r in data)
        data_1 = pd.DataFrame(data, index=idx, columns=cols)
        df = df.append(data_1, sort=False)

        print(file + " Imported to Df...")
    except Exception as e:
        print("Error: " + e + " When attempting to open file: " + file)
        # error_notify(e)
print(df.head(10))
return df

问题是当我们的文件具有某种损坏时。手动打开文件时,将显示以下错误。

Error when manually opening XLSX corrupted file

我想尝试一下,但上面的代码除外,它将捕获这样的错误并使用error_notify(e)函数提醒我。但是,我们得到的结果是Python脚本崩溃并显示如下错误:zipfile.BadZipFile:文件不是zip文件 在处理上述异常期间,发生了另一个异常。

该错误还有很多,但我只在与办公室一些人进行交流时才复制并粘贴了此部分。无法独自复制错误-我不知道文件是如何以这种方式损坏的-除了一天之中有很多人在访问文件。

使文件可读的方法完全是手动的-我们必须打开文件,得到该错误,单击是,然后将文件保存在现有文件上。然后重新启动脚本。但是,由于尝试失败,除非无法捕获并提醒我们失败,所以我们必须手动运行脚本以查看其是否有效。

两个问题-除命令外,我尝试做的事情不正确吗?我公认自己在捕捉错误方面很虚弱,所以我首先想到的是我可以做更多的事情来完成这项工作。其次,是否有Python方法可以克服Excel工作簿文件中的错误?

这是错误文本: 追溯(最近一次通话): 文件“ G:/补货/报告/ 00-I&A补货/ 02-服务 Level / Daily Outs注释Capture / Python / daily_outs_missed_files.py“,第48行,在load_files中 wb = load_workbook(文件) 在load_workbook中的第314行,文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ openpyxl \ reader \ excel.py” data_only,keep_links) init 中的文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ openpyxl \ reader \ excel.py”,第124行 self.archive = _validate_archive(fn) _validate_archive中的文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ openpyxl \ reader \ excel.py”,第96行 存档= ZipFile(文件名,'r') init 中的文件“ C:\ ProgramData \ Anaconda3 \ lib \ zipfile.py”,第1222行 self._RealGetContents() _RealGetContents中的文件“ C:\ ProgramData \ Anaconda3 \ lib \ zipfile.py”,行1289 引发BadZipFile(“文件不是zip文件”) zipfile.BadZipFile:文件不是zip文件

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "G:/Replenishment/Reporting/00 - I&A Replenishment/02 - Service Level/Daily Outs Comment Capture/Python/daily_outs_missed_files.py", line 123, in <module>
main()
  File "G:/Replenishment/Reporting/00 - I&A Replenishment/02 - Service Level/Daily Outs Comment Capture/Python/daily_outs_missed_files.py", line 86, in main
df_output = df_clean()
  File "G:/Replenishment/Reporting/00 - I&A Replenishment/02 - Service Level/Daily Outs Comment Capture/Python/daily_outs_missed_files.py", line 68, in df_clean
df = load_files()
  File "G:/Replenishment/Reporting/00 - I&A Replenishment/02 - Service Level/Daily Outs Comment Capture/Python/daily_outs_missed_files.py", line 61, in load_files
    print("Error: " + e + " When attempting to open file: " + file)
TypeError: can only concatenate str (not "BadZipFile") to str

1 个答案:

答案 0 :(得分:1)

您的try / except代码看起来正确。 python中所有用户定义的异常都应该是基于Exception的类。参见BaseException和 和Exception在python文档中: “异常(..)所有用户定义的异常也应从此类派生”,另请参见python文档部分结尾的the exception class hierarchy tree

如果您的python脚本“崩溃”,则意味着其中一个库过程引发了一个异常,该异常不是基于Exception类的,而“不应该”。您可以查看Traceback并尝试分别捕获令人讨厌的异常类型,或者找到源代码的哪一部分以及哪个库是原因,修复它并提交PR。这是两个示例,它们说明了派生自己的异常的好坏方法

class MyBadError(BaseException):
    """
    my bad exception, do not make yours that way
    """
    pass

代替推荐

class MyGoodError(Exception):
    """
    exception based on the Exception
    """
    pass

在什么地方以及什么地方真正失败仍然是一个谜,但是来自Traceback的异常问题并不新鲜,请参见zipfile.BadZipfile issue in pandas discussion。请注意,熊猫目前使用xlrd读取Excel工作簿数据是一种“无需维护的软件” declaration about xlrd from the authors,如果出现任何问题,建议使用openpyxl或自己解决任何问题(熊猫维护人员正在对此进行pontius pilate,但愉快地使用xlrd作为依赖项)。我建议您将BadZipfile与其他所有异常分开捕获为一个特殊的已知损坏错误,请参见python error handling tutorial 作为示例代码(您可能已经看过了,对其他读者而言)。如果那行不通,我可以在您的库/ python模块的源代码中将其追溯到确切的违规部分,如果您直接伸出手,可以找到罪魁祸首。