在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读取时出错。我已经更新了我的答案。