【问题标题】:Adding a header row with values for each column to multiple CSV files将包含每列值的标题行添加到多个 CSV 文件
【发布时间】:2020-05-18 11:37:23
【问题描述】:

我在一个目录中有多个 CSV 文件,但没有标题。 我正在寻找一种强大的方法来一次将相同的标题添加到我目录中的所有文件中。

Sample.csv:

 John Doe    Guitar    4 units

添加标题“名称”、“产品”、“数量”后所需的输出:

 name       product    quantity 
John Doe    Guitar     4 units

到目前为止,我找到了一种使用 pandas 将标题添加到单个文件中的方法:

from pandas import read_csv      
df = read_csv('/path/to/my/file/Sample.csv')
df.columns = ['name', 'product', 'quantity']
df.to_csv('/path/to/my/file/output.csv')

现在我想我必须添加一个循环来读取我目录中的所有文件并在每个文件中添加所需的标题行。如果可能,有人可以帮助我完成此步骤或建议其他更简单的方法吗?提前谢谢你。

尝试添加循环但它抛出错误消息:

import pandas as pd 
import os
import glob
from pandas import read_csv 
path = '/path/to/my/files/'
filelist = glob.glob(path + "/*.csv")
frame = pd.DataFrame()
list = []
frame = pd.DataFrame()
#whenever i run the below line it throws this error ->   IndentationError: expected an indented block
for file in filelist:
    df2 = pd.read_csv(path+file)
    df2.columns = ['name', 'product', 'qunatity']
    list.append(df2)
frame = pd.concat(list)

【问题讨论】:

    标签: python shell csv terminal


    【解决方案1】:

    Read_csv 有一个可用于列的名称参数。

    如果您想将相同的标题添加到您阅读的每个 csv 中。您可以在读取 .csv 文件时将列传递给名称参数。

    
    df = pd.read_csv('test_.csv', names = ['name', 'product', 'quantity'])
    
    

    编辑您的代码。您在这里做的太多了,您不需要一开始就创建数据框。也不要称你的列表为“列表”列表是python中的一个特殊词。

    您也不需要添加文件的路径,您的 glob 列表已经包含您需要的完整路径。

    关于缩进错误。我会确保您使用一致的缩进,有时如果您使用空格缩进一行而使用制表符缩进另一行,就会发生这种情况。我会简单地删除缩进并以相同的方式将其添加回来。

    import pandas as pd 
    import os
    import glob
    from pandas import read_csv 
    path = '/path/to/my/files/'
    filelist = glob.glob(path + "/*.csv")
    df_list = []
    for file in filelist:
    # you also dont need to add path, the glob should already have the full path
        df2 = read_csv(file,names=['name', 'product', 'quantity'])
        ## save out files
        df2.to_csv(file,index=False)
        df_list.append(df2)
    frame = pd.concat(df_list)
    frame = pd.concat(df_list)
    
    

    还有一种更简单的方法是使用列表理解。见下文。

    import pandas as pd 
    import os
    import glob
    path = '/path/to/my/files/'
    filelist = glob.glob(path + "/*.csv")
    frame = pd.concat([pd.read_csv(file,names=['name', 'product', 'quantity']) for file in filelist])
    

    【讨论】:

    • 嗨,jawsem,您能分享更多信息吗?我只是python的初学者。我在上面的循环中添加了一些额外的代码。但是,我很难说我应该在哪里以及如何添加您提到的 names 参数。谢谢!
    • @Baobab1988 我添加了一些额外的细节。如果您有任何问题,请告诉我。关于最初的帖子,该链接包含有关您正在使用的 read_csv 函数的文档。 Pandas 是一个有据可查的库,因此如果您需要帮助了解您调用的函数或方法是什么,您可以随时参考它的文档。
    • 您好,jawsem,感谢您的详细解释!它现在似乎运行没有错误。但是,如果您不介意,我还有最后一个问题。它不会修改我的 CSV 文件。所以运行脚本后标题不存在。不过,一旦我输入print(frame),我就可以在终端中看到标题。您知道如何将标题保存到指定路径中的文件吗?
    • 您可以在 for 循环中添加一个 to_csv。我将它添加到帖子中。
    • 我已经尝试添加这个位 df=frame df.to_csv(path + "/*.csv") 并且这部分工作。部分是因为现在它保存了所有标题,但没有保存在我的多个 csv 文件中,而是创建了一个名为 *.csv 的文件。你能帮忙吗?抱歉这么多问题,但这是我使用 python 的第一步。谢谢!
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    相关资源
    最近更新 更多