为什么我的 for 循环在 Python 中不能正常工作?

Why does my for-loop not work properly in Python?

Python 的新功能,希望大家能帮忙

我有一个带有这个 for 循环的脚本,它检查目录中的文件列表,我需要做的是,如果每个文件以 'xlsx' 结尾,它会执行一段代码,如果它以'csv' 它执行其他块代码。 我必须创建变量 extension 来提取文件的扩展名,因为如果我使用 file,它会显示错误 WindowsPath' object has no attribute 'endswith'


for file in file_list:
        #to extract the file extension:
        extension = os.path.splitext(file)[1][1:]
        print(file)

        if extension.endswith('xlsx'):
            all_df_list.append(pd.read_excel(file, header=0, engine='openpyxl'))
            a = round(time.time() - start_time,2)
            print(a)
        elif extension.endswith('csv'):
            all_df_list.append(pd.read_csv(file, chunksize=10000))
            a = round(time.time() - start_time,2)
            print(a)
        else:
            print("Not working")

当我 运行 整个脚本时,它开始循环并执行第一个文件的命令,但随后一直执行到 else 语句。它应该对每个文件做同样的事情...这些是结果(用 xxx 隐藏敏感信息)

Z:\DataFiles\XXX\XXX\XXX\XXX\XXX\XXX_XXX_0000.xlsx
2.43
Z:\DataFiles\XXX\XXX\XXX\XXX\XXX\XXX_XXX_2019.XLSX
Not working
Z:\DataFiles\XXX\XXX\XXX\XXX\XXX\XXX_XXX_2020.XLSX
Not working
Z:\DataFiles\XXX\XXX\XXX\XXX\XXX\XXX_XXX_2021.XLSX
Not working
Z:\DataFiles\XXX\XXX\XXX\XXX\XXX\XXXX_2022.XLSX
Not working

你能指出我做错了什么吗?

你不能在循环外定义extension = os.path.splitext(file)[1][1:]吗?

您的脚本正在查找 .xlsx 和 .csv,因此 .XLSX 在 else 中处理: 阻止。
当您将值分配给变量扩展名时,您可以使用函数 .lower()

extension = os.path.splitext(file)[1][1:].lower()

使用pathlib for pathing,你可以从.name!

获取字符串
>>> import pathlib
>>> p = pathlib.Path("foo/bar/baz.EXT")
>>> p.name.lower().endswith(".ext")
True

由于 file 是一个 WindowsPath 对象(如错误所示),您可能想使用 .suffix,并在比较之前使用 .lower() 将其小写针对小写扩展名:

for file in file_list:
    if file.suffix.lower() == '.xlsx':
        all_df_list.append(pd.read_excel(file, header=0, engine='openpyxl'))
    elif file.suffix.lower() == '.csv':
        all_df_list.append(pd.read_csv(file, chunksize=10000))
    else:
        print("Not working")
        continue
    print(round(time.time() - start_time, 2))

我尝试了不同的解决方案,按照建议,我只是使用了:

        if file.suffix.lower() == '.xlsx':
            all_df_list.append(pd.read_excel(file, header=0, engine='openpyxl'))
            a = round(time.time() - start_time,2)
            print(a)
        elif file.suffix.lower() == '.csv':
            all_df_list.append(pd.read_csv(file, chunksize=10000))
            a = round(time.time() - start_time,2)
            print(a)

它奏效了。非常感谢!!!