【问题标题】:Invalid extension for engine problem, iterating through directories and files引擎问题的无效扩展名,遍历目录和文件
【发布时间】:2022-11-13 04:05:31
【问题描述】:

我有一个代码,如果我手动为 path, directory and file name 插入字符串,它可以正常工作,这是代码:

path = r"test//ab3b//ab3b_all_anal.xlsx"
directory = "test"

file1 = "test//ab3b//ab3b80.csv"
df1 = all_calc_80(file1, directory)

file2 = "test//ab3b//ab3b80m.csv"
df2 = all_calc_80m(file2, directory)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = '80')
df2.to_excel(writer, sheet_name = '80m')
writer.close()

测试目录有名为ab3b, bg3a, ge3b等的子目录,并且在每个子目录中都有以相同方式命名的文件:ab3b80.csv, ab3b80m.csv; bg3a80.csv, bg3a80m.csv; ge3b80.csv, ge3b80m.csv

每个基于结尾80.csv or 80m.csv 的文件使用不同的函数进行分析。 最终输出是一个在csv 文件结束后带有工作表名称的 Excel 工作簿。

现在我正在遍历整个目录test,在这里我只需给出directory 的名称,一切都会从那里自动进行。到目前为止,我有:

import os
import xlsxwriter
rootdir = 'test'

slovar = {}
for subdir, dirs, files in os.walk(rootdir):
        slovar[subdir] = files
    

for key, value in slovar.items():
    if len(key) > 4:               #to get just subdirectories I need
        end = key[-4:]
        path = 'r' + '\'' + key + '\\\\' + end + '_all_anal.xlsx' + '\''
        print(path)
        
    for vrednost in value:        
        if vrednost.endswith('80.csv'):
            file1 = vrednost
            df1 = all_calc_80(file1, rootdir)

        elif vrednost.endswith('80m.csv'):
            file2 = vrednost
            df2 = all_calc_80m(file2, rootdir)
            
    writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
    df1.to_excel(writer, sheet_name = '80')
    df2.to_excel(writer, sheet_name = '80m')
    writer.close()

但我收到错误消息:Invalid extension for engine '<property object at 0x000002123659D0E0>': 'xlsx''

我认为由于 Windows 路径或对象类型中的 /\ 可能存在一些问题,即使当我只打印键和值时,我得到有用的输出,路径的名称也正确写入。

但我真的不明白为什么手动一切正常而自动化不行。

【问题讨论】:

    标签: python excel automation operating-system xlsxwriter


    【解决方案1】:

    如果有人仍然会搜索这个答案,我已经找到了解决方案。 主要发现是关于如何将路径和文件名附加到列表中。 如果您使用os.walk,则使用os.path.join(dirpath, filename) 完成。

    这是工作代码:

    seznam80 = []
    seznam80m = []
    seznam120 = []
    seznam120m = []
    seznam150 = []
    seznam150m = []
    seznamSMT = []
    dirp = []
    
    for dirpath, dirnames, filenames in os.walk(directory): #directory with all folders of participants
            for filename in [f for f in filenames if f.endswith("80.csv")]: #search for all 80 files
                seznam80.append(os.path.join(dirpath, filename))
                dirp.append(dirpath)
    
    for dirpath, dirnames, filenames in os.walk(directory): #directory with all folders of participants
            for filename in [f for f in filenames if f.endswith("80m.csv")]: #search for all 80m files
                seznam80m.append(os.path.join(dirpath, filename))
    
    for vsak80, vsak80m pot in zip(seznam80, seznam80m, dirp):
            path = pot + '_all_anal.xlsx'
    
            file1 = vsak80
            df1 = all_calc_80(file1, directory)
    
            file2 = vsak80m
            df2 = all_calc_80m(file2, directory)
    
            writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
            df1.to_excel(writer, sheet_name = '80')
            df2.to_excel(writer, sheet_name = '80m')
            
            writer.close()
    

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多