向每个CSV文件添加具有每一列值的标题行

时间:2020-02-02 14:14:40

标签: python shell csv terminal

我在一个目录中有多个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)

1 个答案:

答案 0 :(得分:1)

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

如果要将相同的标头添加到读取的每个csv中。读取.csv文件时,只需将这些列传递到names参数中即可。

    hTex = new int[1];
    GLES20.glGenTextures ( 1, hTex, 0 );
    GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, hTex[0]);
    GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);

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

您也不需要将路径添加到文件,您的全局列表将已经具有所需的完整路径。

关于缩进错误。我会确保您使用的是一致的缩进,如果您使用空格为一行缩进,而使用制表符为另一行缩进,则有时会发生这种情况。我只需删除缩进,然后以相同的方式添加回去。


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

还有一个更简单的列表理解方法。见下文。

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)

相关问题