在python中将新数据列添加到csv文件

在python中将新数据列添加到csv文件,python,Python,我试着做两件事 向文件中添加一些“元数据”列 创建一个字典,将文件头键入该值 这是文件的一个示例 date,id,type,ccy,mtm,base,20151015,20151016,20151019,20151020,20151021,20151022 20161209,118,book,cad,-2493980,0,3845,1902,-1130,6052,-5594,-1419 20161209,118A188,bond,cad,-407954,0,5,11,5,23,3,-7 2016

我试着做两件事

向文件中添加一些“元数据”列 创建一个字典,将文件头键入该值 这是文件的一个示例

date,id,type,ccy,mtm,base,20151015,20151016,20151019,20151020,20151021,20151022
20161209,118,book,cad,-2493980,0,3845,1902,-1130,6052,-5594,-1419
20161209,118A188,bond,cad,-407954,0,5,11,5,23,3,-7
20161209,118A193072,bond,cad,111227,0,-296,-155,73,-429,410,95
20161209,118A217,bond,cad,4058,0,0,0,0,-2,1,0
对于1,我可以将列添加到标题中,但对列的附加似乎是跨标题而不是在标题下进行的…我正在添加到标题中,如

导入操作系统 导入csv

data = '/home/usr/local/bin/dev/remote/xx-yyy-zzz-118-sample.csv'

file_path = (os.path.dirname(data))
portfolio = ((os.path.basename(data)).strip().split('-')[3])

with open(data, 'r') as f:
    data = []

    r = csv.reader(f, delimiter = ',')

    header = next(r)
    header.append('portfolio')
    portfolio_col = next(r)
    header.append('file_path')
    file_path_col = next(r)
    print(header)
旧标题

['date', 'id', 'type', 'ccy', 'mtm', 'base', '20151015', '20151016', '20151019', '20151020', '20151021', '20151022']
['date', 'id', 'type', 'ccy', 'mtm', 'base', '20151015', '20151016', '20151019', '20151020', '20151021', '20151022', 'portfolio', 'file_path']
新标题

['date', 'id', 'type', 'ccy', 'mtm', 'base', '20151015', '20151016', '20151019', '20151020', '20151021', '20151022']
['date', 'id', 'type', 'ccy', 'mtm', 'base', '20151015', '20151016', '20151019', '20151020', '20151021', '20151022', 'portfolio', 'file_path']
我试图像这样附加列,但它不是我想要的工作

for row in f:
      portfolio_col.append(portfolio)
     file_path_col.append(file_path)
     data.append(portfolio_col)
print(data)
这是一种对行的迭代,但不是我想要的方式

[['20161209', '118', 'book', 'cad', '-2493980', '0', '3845', '1902', '-1130', '6052', '-5594', '-1419', '118', '118'], ['20161209', '118', 'book', 'cad', '-2493980', '0', '3845', '1902', '-1130', '6052', '-5594', '-1419', '118', '118']]
我也在努力在标题键上创建字典,但这个问题已经足够长了,我可能会问另一个单独的问题

另外,我试图这样做,但我有问题的标题作为一个列表

with open(filename,'r') as f:
    header=f.readline().strip().split(',')    
    data = []
    for line in f:

        values=line.strip().split(',')
        row=dict()
        for i,h in enumerate(header):
            row[h]=values[i]

        data.append(row)
像这样的

data = '/home/usr/local/bin/dev/remote/xx-yyy-zzz-118-sample.csv'

file_path = (os.path.dirname(data))
portfolio = ((os.path.basename(data)).strip().split('-')[3])

with open(data, 'r') as f:
    data = []

    reader = csv.reader(f, delimiter = ',')

    header = next(reader)
    header.append('portfolio')
    header.append('file_path')
    print(header)
    data.append(header)
    for row in reader:
        row.append(portfolio)
        row.append(file_path)
        data.append(row)
print(data)
像这样的

data = '/home/usr/local/bin/dev/remote/xx-yyy-zzz-118-sample.csv'

file_path = (os.path.dirname(data))
portfolio = ((os.path.basename(data)).strip().split('-')[3])

with open(data, 'r') as f:
    data = []

    reader = csv.reader(f, delimiter = ',')

    header = next(reader)
    header.append('portfolio')
    header.append('file_path')
    print(header)
    data.append(header)
    for row in reader:
        row.append(portfolio)
        row.append(file_path)
        data.append(row)
print(data)

你可以用熊猫来解决这个问题。 这样,向文件中添加列和追加内容就变得很简单了

import os 
import pandas as pd
data = '../remote/xx-yyy-zzz-118-sample.csv'

df = pd.read_csv(data)
file_path = (os.path.dirname(data))
portfolio = ((os.path.basename(data)).strip().split('-')[3])

df['file_path'] = file_path
df['portfolio'] = portfolio
df.to_csv(data)
print(df)

       date          id  type  ccy      mtm  base  20151015  20151016  \
0  20161209         118  book  cad -2493980     0      3845      1902   
1  20161209     118A188  bond  cad  -407954     0         5        11   
2  20161209  118A193072  bond  cad   111227     0      -296      -155   
3  20161209     118A217  bond  cad     4058     0         0         0   

   20151019  20151020  20151021  20151022  file_path portfolio  
0     -1130      6052     -5594     -1419  ../remote       118  
1         5        23         3        -7  ../remote       118  
2        73      -429       410        95  ../remote       118  
3         0        -2         1         0  ../remote       118 

你可以用熊猫来解决这个问题。 这样,向文件中添加列和追加内容就变得很简单了

import os 
import pandas as pd
data = '../remote/xx-yyy-zzz-118-sample.csv'

df = pd.read_csv(data)
file_path = (os.path.dirname(data))
portfolio = ((os.path.basename(data)).strip().split('-')[3])

df['file_path'] = file_path
df['portfolio'] = portfolio
df.to_csv(data)
print(df)

       date          id  type  ccy      mtm  base  20151015  20151016  \
0  20161209         118  book  cad -2493980     0      3845      1902   
1  20161209     118A188  bond  cad  -407954     0         5        11   
2  20161209  118A193072  bond  cad   111227     0      -296      -155   
3  20161209     118A217  bond  cad     4058     0         0         0   

   20151019  20151020  20151021  20151022  file_path portfolio  
0     -1130      6052     -5594     -1419  ../remote       118  
1         5        23         3        -7  ../remote       118  
2        73      -429       410        95  ../remote       118  
3         0        -2         1         0  ../remote       118 

谢谢你。我对pandas比较满意,这肯定是一个更简单的解决方案,但我正在尝试用纯python进行改进,所以我试图看看我是否可以在没有panad的情况下实现。不过这很有效,谢谢。我对pandas比较满意,这肯定是一个更简单的解决方案,但我正在尝试用纯python进行改进,所以我试图看看我是否可以在没有panad的情况下实现。尽管如此,谢谢。我不确定我的代表去了哪里,但可能我忘记添加注释了…无论如何,谢谢你的建议,但我在row.appendportfolio,row.appendfile_path中遇到了一个错误…AttributeError:'str'对象没有属性'append'…我尝试用数据替换row,但也没有正常工作。我尝试仅使用data.appendrow打印,但除了列表中的标题之外,其他条目都是字符串…[[,“日期”,“id”,“类型”,“ccy”,“mtm”,“基本”,“20151015”,“20151016”,“20151019”,“20151020”,“20151021”,“20151022”,“文件路径”,“公文包”,“公文包”,“文件路径”],0201611209118,图书,cad,-2493980,038451902,-11306052,-5594,-1419,/home/usr/local/bin/dev/remote/,118\n,'120161209118a188,bond,cad,-407954,0,5,11,5,5,5,23,3,-7,/home/usr/local/bin/dev/remote/,118\n,'220161209118a193,bond,cad,111227,0,-296,-155,73,-429410,95,/home/usr/local/bin/bin/remote/bin/,118\n,/des,'A20,1180,1610,10,10,10,10,18,',-2,1,0,/home/usr/local/bin/dev/remote/,118\n']是的,我从文件而不是从csv.reader读取时出错。我已经更新了我的答案。我不确定我的代表去了哪里,但可能我忘记添加注释了…无论如何,谢谢你的建议,但是我在row.appendportfolio,row.appendfile_path中遇到了一个错误…AttributeError:'str'对象没有属性'append'…我尝试用数据替换row,但也没有正常工作。我尝试仅使用data.appendrow打印,但除了列表中的标题之外,其他条目都是字符串…[[,“日期”,“id”,“类型”,“ccy”,“mtm”,“基本”,“20151015”,“20151016”,“20151019”,“20151020”,“20151021”,“20151022”,“文件路径”,“公文包”,“公文包”,“文件路径”],0201611209118,图书,cad,-2493980,038451902,-11306052,-5594,-1419,/home/usr/local/bin/dev/remote/,118\n,'120161209118a188,bond,cad,-407954,0,5,11,5,5,5,23,3,-7,/home/usr/local/bin/dev/remote/,118\n,'220161209118a193,bond,cad,111227,0,-296,-155,73,-429410,95,/home/usr/local/bin/bin/remote/bin/,118\n,/des,'A20,1180,1610,10,10,10,10,18,',-2,1,0,/home/usr/local/bin/dev/remote/,118\n']是的,我从文件而不是从csv.reader读取时出错。我已经更新了我的答案。