代码之家  ›  专栏  ›  技术社区  ›  ah bon

迭代Excel文件并在python的一个文件夹中输出

  •  0
  • ah bon  · 技术社区  · 6 年前

    我有一个文件夹和子文件夹结构,如下所示:

    D:/src
    ├─ xyz.xlsx
    ├─ dist
    │  ├─ xyz.xlsx
    │  ├─ xxx.zip
    │  └─ xxy.xlsx
    ├─ lib
    │  ├─ xy.rar
    │  └─ xyx.xlsx
    ├─ test
    │  ├─ xyy.xlsx
    │  ├─ x.xls
    │  └─ xyz.xlsx
    

    我要从源目录和子目录中提取所有Excel文件(XLS或XLSX),根据Excel文件名删除重复项,并将所有唯一文件放在d:/dst目录中。如何在python中获得以下结果?谢谢。 预期结果:

    D:/dst
    ├─ xyz.xlsx
    ├─ xxy.xlsx
    ├─ xyx.xlsx
    ├─ xyy.xlsx
    ├─ x.xls
    

    以下是我的尝试:

    import os
    
    for root, dirs, files in os.walk(src, topdown=False):
        for file in files:
            if file.endswith('.xlsx') or file.endswith('.xls'):
                #print(os.path.join(root, file))
                try:
                    df0 = pd.read_excel(os.path.join(root, file))
                    #print(df0)
                except:
                    continue
                df1 = pd.DataFrame(columns = [columns_selected])
                df1 = df1.append(df0, ignore_index = True)
                print(df1)
                df1.to_excel('test.xlsx', index = False)
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   martineau    6 年前

    我认为这会满足你的需求:

    import os
    import shutil
    
    
    src = os.path.abspath(r'.\_src')
    dst = os.path.abspath(r'.\_dst')
    wanted = {'.xls', '.xlsx'}
    
    copied = set()
    
    for root, dirs, filenames in os.walk(src, topdown=False):
        for filename in filenames:
            ext = os.path.splitext(filename)[1]
            if ext in wanted and filename not in copied:
                src_filepath = os.path.join(root, filename)
                shutil.copy(src_filepath, dst)
                copied.add(filename)
    
        2
  •  1
  •   aneroid    6 年前

    既然你已经 glob.glob 你不需要也这么做 os.walk 反之亦然。但是,由于glob一次只匹配一个模式,并且没有办法在扩展名中表示可选的额外“x”,所以您要么需要 glob 循环两次-每个扩展一次;或使用 glob.glob( 'D:\\src\\*.xls*') 哪个可以匹配 '*.xlsm' 等。

    对于每个匹配的文件,使用 shutil.move :

    for file in glob.glob('D:\\src\\*.xls*'):
        shutil.move(file, 'D:\\dst\\' + os.path.basename(file))
    

    步行 ,您可以使用 fnmatch.fnmatch 在同一个循环中:

    for root, dirs, files in os.walk('D:\\src'):
        for file in files:
            if fnmatch.fnmatch(file, '*.xls') or fnmatch.fnmatch(file, '*.xlsx'):
                shutil.move(f'{root}\\{file}', f'D:\\dst\\{file}')
                # shutil.move(root + '\\' + file, 'D:\\dst\\' + file)