Python迭代文件夹并在里面组合csv文件

时间:2018-03-07 01:12:57

标签: python csv

Windows操作系统 - 我有几百个子目录,每个子目录包含一个或多个.csv文件。所有文件的结构都相同。我正在尝试遍历每个文件夹并将每个子目录中的所有文件连接到一个新文件中,该文件组合了该子目录中的所有.csv文件。

示例:

folder1 - > file1.csv,file2.csv,file3.csv - >> file1.csv,file2.csv,file3.csv,combined.csv

folder2 - > file1.csv,file2.csv - >> file1.csv,file2.csv,combined.csv

非常新的编码和迷失。尝试使用os.walk但完全失败。

1 个答案:

答案 0 :(得分:0)

os.walk生成的生成器每次迭代产生三个项目:walk中当前目录的路径,表示下一个将遍历的子目录的路径列表,以及当前包含的文件名列表。目录

如果由于某种原因你不想走某些文件路径,你应该删除下面我称之为sub的条目(root中包含的子目录列表)。这样可以防止os.walk遍历您删除的所有路径。

我的代码不会修剪行走。如果您不想遍历整个文件子树,请务必更新。

以下大纲应该适用于此,尽管我无法在Windows上进行测试。我没有理由认为它的行为会有所不同。

import os
import sys


def write_files(sources, combined):
    # Want the first header
    with open(sources[0], 'r') as first:
        combined.write(first.read())

    for i in range(1, len(sources)):
        with open(sources[i], 'r') as s:
            # Ignore the rest of the headers
            next(s, None)
            for line in s:
                combined.write(line)


def concatenate_csvs(root_path):
    for root, sub, files in os.walk(root_path):
        filenames = [os.path.join(root, filename) for filename in files
                     if filename.endswith('.csv')]
        combined_path = os.path.join(root, 'combined.csv')
        with open(combined_path, 'w+') as combined:
            write_files(filenames, combined)


if __name__ == '__main__':
    path = sys.argv[1]
    concatenate_csvs(path)