os.walking遍历目录结构以读取许多CSV标头并将其写入输出CSV

时间:2018-09-21 22:57:52

标签: python csv

我有一个包含60个文件夹的文件夹,每个文件夹包含大约60个CSV(以及1或2个非CSV)。

我需要比较所有这些CSV的标题行,因此我试图遍历目录并将以下内容写入输出CSV:(1)有关文件的文件路径和(2)输出CSV中该行的后续单元格。

然后转到下一个文件,并将相同的信息写入输出CSV的下一行。

我在将标头行写入CSV的过程中迷失了方向-而且迷失了方向,甚至没有生成错误消息。

有人可以建议下一步做什么吗?

@DirtiesContext

2 个答案:

答案 0 :(得分:1)

您似乎对正在读取和写入的文件感到困惑。当您尝试在一项大功能中完成所有工作时,混乱是正常的。功能的全部目的是分解事物,以便易于跟踪,理解和调试。

这是一些无效的代码,但是您可以轻松打印出每个函数返回的内容,一旦知道是正确的,就将其提供给下一个函数。每个函数很小,变量很少,所以不会出错。

最重要的是,每个函数中的变量都是局部变量,这意味着它们不能干扰其他地方发生的事情,甚至不能使您认为它们可能在干扰(并且有很大的不同)。

def collect_csv_data():
    results = []
    for root, dirs, files in os.walk(args):
        for file in files:
            if file.endswith('.csv'):
                headers = extract_headers(os.path.join(root, file))
                results.append((file, headers))
    return results

def extract_headers(filepath):
    with open(filepath) as f:
        reader = csv.reader(f)
        headers = reader.next()
    return headers

def write_results(result, filepath):
    with open(filepath, 'w') as f:
        writer = csv.writer(f)
        for result in results:
            writer.writerow(result)

if __name__ == '__main__':
    directory = sys.argv[1]
    results = collect_csv_data(directory)
    write_results(results, 'results.csv')

答案 1 :(得分:1)

IIUC,您需要一个新的带有两列的csv文件:file_path和headers。 如果您需要的标头只是该csv中的列名列表,那么如果您先使用pandas数据框来存储这些值,然后再将该数据框写入csv,则会更容易。

import pandas as pd

res = []
for root, dirs, files in os.walk(args):
    for item in files:
        # Check if the item is a CSV
        if item.endswith('.csv'):
            # If yes, read the first row
            df = pd.read_csv(item)
            row = {}
            row['file_path'] = os.path.realpath(item)
            row['headers'] = df.columns
            res.append(row)
res_df = pd.DataFrame(res)
res_df.to_csv(csvfile)