Python - 对于文件夹中的所有 csv 文件,使用 header 名称和它们来自的文件创建新的 csv 文件

Python - for all csv files in folder make new csv file with header names and the file they came from

我有一个代码,我要写入五个 csv 文件,在创建所有 CSV 文件后,我想 运行 一个函数来放置所有 headers到 csv 或 xlsx 文件中,其中每一行代表文件中的 header。

所以在名为“Example”的文件夹中有 5 个 csv 文件,分别名为“1.csv”、“2.csv”...“5.csv”;对于我想要的代码,将创建一个名为“Headers of files in Example”的新文件,其中第一列是 header 来自的 csv 文件的名称,以及第二列包含 header。最终看起来像这样:contents of Headers of files in example,其中 1.csv 的 header 是 a,b,c 等等。

我的 python 编码在这一点上是相当基础的,但我绝对认为我想做的是可能的。任何帮助的建议将不胜感激!

假设你在内存中有DataFrame,你只需要创建一个新的DataFrame,我喜欢使用列表字典来创建它,然后对于每个file/dataframe你提取列并将其上传到模拟数据框。 稍后您可以将新的 DataFrame 保存到文件中。

summary_df = {
    'file_name': list(),
    'headers': list()}

for file, filename in zip(list_of_files, list_of_names):
    aux_headers = file.columns.to_list()
    summary_df['headers'] += aux_headers
    summary_df['file_name'] += [filename] * len(aux_headers)

summary_df = pd.DataFrame(summary_df)

希望这段代码对您有所帮助。本质上它所做的是遍历所有你想要的文件,它们的名字在 file_names 中,然后使用 pandas 读取它们。加载 csv 后,您使用 df.columns 提取 headers 并将其存储在列表中,然后通过 pandas.

将其另存为新的 csv
import pandas as pd
header_names = []
file_names = ['1.csv', '2.csv']
for file_name in file_names:
    df = pd.read_csv(file_name)
    header_names.extend(list(df.columns))
new_df = pd.DataFrame(l)
new_df.to_csv("headers.csv")

经过更多的挖掘,经过一些细微的修改,我找到了一些可以实现我想要的功能的代码:

import csv
import glob
import pandas as pd


def headers():
    path = r'path to folder containing csv files/'
    all_files = glob.glob(path + "*.csv")
    files = all_files
    myheaders = ['filename', 'header']
    with open("Headers of foldername.csv", "w", newline='') as fw:
        cw = csv.writer(fw, delimiter=",")
        for filename in files:
            with open(filename, 'r') as f:
                cr = csv.reader(f)
                # get title
                for column_name in (x.strip() for x in next(cr)):
                    cw.writerow([filename, column_name])
        file = pd.read_csv("Headers of foldername.csv")
        file.to_csv("Headers of foldername.csv", header=myheaders, index=False)