首页 > 编程问答 >如何在Python中处理FileNotFoundException

如何在Python中处理FileNotFoundException

时间:2024-07-31 12:13:30浏览次数:7  
标签:python exception filenotfoundexception

我有一个函数可以从路径读取 avro 文件(按日文件夹)并将其写入 相同的路径(聚合到按月的文件夹)。如果文件夹有 .avro 文件,该函数可以正常工作。

但如果文件夹为空,我会收到错误。

java.io.FileNotFoundException: No avro files found. If files don't have .avro extension, set ignoreExtension to true

我已经使用 try 和 except 块进行了处理。即使那样我也会收到错误。这是下面的函数。

def aggregate_data(path_to_source, input_format, output_format, output_table_format='avro'):
    all_input_dates = [str(fileStatus.getPath()).split('/')[-1] for fileStatus in
                        lake.listStatus(fs.Path(path_to_source))
                        if 'latest' not in str(fileStatus.getPath())]
                        
    all_output_dates = list(set(datetime.datetime.strptime(i, input_format).strftime(output_format)
                        for i in all_input_dates if validate_date(i, input_format) - {datetime.date.today().strftime(output_format)})
                        
    print("***** {0} *****".format(path_to_source))
    
    try:
        for _partition in all_output_dates:
            src_df = spark.read.option("ignoreExtension":"true"). format(output_table_format)\
                        .load(os.path.join(path_to_source, '{0}*'.format(_partition)))
                        
            agg_df = src_df.repartition(estimate_part_num(src_df)).write.mode('overwrite')\
                        .format(output_table_format).save(os.path.join(path_to_source, _partition))
                        
            command_exist = ['hadoop', 'fs', '-rm', '-r', os.path.join(path_to_source, '{0}[.]*'. format(_partition))]
            subprocess.call(command_exist)
    except FileNotFoundException as e: 
        print("**** Exception occured ****".format(path_to_source),e)

如何在 python 中处理 FileNotFoundException


看来你的问题不是 FileNotFoundException 本身,而是代码中其他的地方导致了这个异常的抛出。错误信息 "No avro files found." 表明这是 Spark 在尝试读取 Avro 文件时抛出的异常,而不是 Python 解释器抛出的 FileNotFoundException。

以下是改进你的代码并处理这种情况的步骤:

  1. 捕获 Spark 异常 : Python 的 FileNotFoundException 不会捕获 Spark 抛出的异常。你需要捕获更通用的异常类型,比如 Py4JJavaError ,它包含 Spark 抛出的 Java 异常。

  2. 检查目录是否存在 : 在尝试读取数据之前,先检查目录是否存在。你可以使用 os.path.isdir 函数来检查目录是否存在。

  3. 处理空目录 : 如果目录存在但为空,你可以选择跳过该目录或者进行其他处理。

以下是修改后的代码:

def aggregate_data(path_to_source, input_format, output_format, output_table_format='avro'):
    # ... (获取日期列表)

    print("***** {0} *****".format(path_to_source))

    for _partition in all_output_dates:
        # 构建目录路径
        dir_path = os.path.join(path_to_source, _partition)

        # 检查目录是否存在
        if os.path.isdir(dir_path):
            try:
                # 读取数据,如果目录为空,可能会抛出异常
                src_df = spark.read.option("ignoreExtension", "true") \
                    .format(output_table_format) \
                    .load(os.path.join(dir_path, '*'))

                # ... (处理数据)
            except Py4JJavaError as e:
                # 打印异常信息
                print(f"**** Exception occured while processing {dir_path}: {e}")
                # 检查是否为 "No avro files found" 异常
                if "No avro files found" in str(e):
                    print(f"**** Directory {dir_path} is empty. Skipping...")
                else:
                    # 其他 Spark 异常,可能需要进一步处理或抛出
                    raise e
        else:
            print(f"**** Directory {dir_path} does not exist. Skipping...")

        # ... (删除旧数据)

这段代码会检查每个日期目录是否存在,如果存在但为空,则会打印一条信息并跳过该目录。如果遇到其他类型的异常,则会打印异常信息并抛出异常,以便你能进行调试。

希望这些改进可以帮助你解决问题。如果还有其他问题,请告诉我。

标签:python,exception,filenotfoundexception
From: 78814397

相关文章

  • 有谁知道如何在 ROS 中使用 python 开发赛车模拟编码?
    在模拟中,主要目标是让自动驾驶汽车读取AprilTags并根据标牌提供的说明进行导航。AprilTags是一种基准标记,可作为重要的视觉提示,传达有关汽车周围环境的信息,例如方向、速度限制和其他关键路标。汽车的车载视觉系统应该检测这些标签,解码嵌入的数据,并相应地调整其运动。这包括在......
  • python实现提取视频帧的图片
    文章目录1、需求痛点2、完整代码⭐3、代码分析3.1、需要改动的地方3.2、OpenCV库的使用3.3、多线程技术4、执行效率5、效果展示⭐6、注意事项......
  • 三种语言实现差分(C++/Python/Java)
    题目输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l,r,c表示将序列中[l,r]之间的每个数加上c。请你输出进行完所有操作后的序列。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数序列。接下来m行,每行包含三个整数l,r,c,表......
  • Python编程的16个坏习惯
    1、手动进行字符串格式化#坏习惯name="Alice"greeting = "Hello, " + name +"!" #好习惯name="Alice"greeting=f"Hello,{name}!" 理由:使用+进行字符串拼接会导致代码可读性差,而且在复杂情况下容易出错,f-string可读性更好 2、手动关闭文件#坏习惯......
  • Flask框架入门:快速搭建轻量级Python网页应用
    转载: Flask框架入门:快速搭建轻量级Python网页应用1. Flask基础Flask是一个使用Python编写的轻量级Web应用框架。它的设计目标是让Web开发变得快速简单,同时保持应用的灵活性。Flask依赖于两个外部库:Werkzeug和Jinja2,Werkzeug作为WSGI工具包处理Web服务的底层细节,Jinja2作为......
  • 我有一个“pywhatkit”python 模块属性错误。你能帮我吗?
    Pywhatkit已成功安装,但在任何属性代码中都显示属性错误。我可以修复它吗?我尝试过的代码:importpywhatkitpywhatkit.sendmsg('071*******','Ado',15,48)我如何修复这个问题:我将程序文件名“pywhatkit.py”重命名为“anotername.py”。谢谢所有帮......
  • 如何使用Python获取Excel文件中嵌入图像的位置?
    我正在使用包含嵌入图像的Excel文件(.xlsx)。我需要使用Python以编程方式提取这些图像的位置(单元格引用)。这是我到目前为止所尝试过的:任何建议将不胜感激。使用openpyxl和openpyxl-image-loader:我没有处理嵌入图像。解压缩Excel文件并检查内容:......
  • cmd输入python直接弹出windows应用商店
    明明已经安装好了python,并且也确认配置好了python的环境变量,但是在cmd里输入python后,直接弹出windows商店,python获取界面,其实只需要关闭系统里的应用执行别名设置,最近出来的电脑系统里是自带开启了python相关的执行别名。步骤是【设置】-【应用】-【高级应用设计】-【应用执行名称......
  • Python 数学问题:(2**3+(5+6)**(1+1)) =?
    (2**3+(5+6)**(1+1))=?如果您能提供一步一步的解决方案,我将不胜感激。计算机向我展示了答案,但我只是不知道它是如何得出的。所以,如果可以的话,让我知道就太好了。我已经被“**”部分困住了,而且也对“3”的用途感到困惑。我尝试了这个问题,得到了131,但这不是答案。让我......
  • Python - Generators
    Thetaskofimplementingiteratorscanbesimplifiedbyusinggenerators.Wehaveseenhowtocreatecustomiteratorsusingtheobject-orientedway,i.e.,bydefiningaclassthathas__init__,__next__,and__iter__methods.Forexample,wesawtheCubes......