如何使用csv模块添加列?

时间:2014-12-22 19:59:08

标签: python list csv

我有一个带有数据矩阵的csv文件。在记事本中打开初始csv文件时,它看起来像这样:

" AAA,15.0" " BBB,45.0" " CCC,60.0"

然后我想要处理这些数据,添加另一列来获得如下格式:

" AAA,15.0,50.0" " BBB,45.0,30.0" " CCC,60.0,20.0"

所以....... 我使用以下命令将原始文件打开到Python中

with open((FilePath"/XXX.csv"), 'rt') as csvfile:
   NewData = list(csv.reader(csvfile, delimiter=';'))

print(NewData)

第一次执行此操作时,代码会生成一个字符串列表(我真的很高兴 - 我想要这种格式)...

[' AAA,15.0,50.0',' BBB,45.0,30.0',' CCC,60.0,20.0']

但是下次我尝试添加一个列时,我最终得到....

[[' AAA,15.0,50.0'],[' BBB,45.0,30.0'],[' CCC,60.0,20.0' ]

因此,每次我的代码运行时,都会添加一个额外的'列出'。

我需要做些什么来保持字符串列表的初始格式?我想是因为我用list()命令打开文件。我该怎么用?


根据要求提供更多细节.........

进一步提炼......我的代码是......

import csv

FilePathSB="C:/Users/"

with open((FilePathSB+"/Master.csv"), 'rt') as csvfile:

   xMatrix = list(csv.reader(csvfile, delimiter=';'))

####Do something to the data like add another column of numbers                                                      

#SaveAs same file

with open(FilePathSB+"/Master.csv", "w") as output:
   writer=csv.writer(output,lineterminator='\n')
   for val in xMatrix:
      writer.writerow([val])

请注意,在文件打开时会发生一些数据操作,但这不会影响我遇到的问题,因此我将代码保留了。

打开文件然后保存它是添加一个'列表'每次代码运行。我希望格式保持不变(即尽管打开然后重新保存,但我希望数据格式与下面显示的初始矩阵相同)。

因此,第一次运行代码时,会打开以下初始csv数据:

"AAA,24:17"
"BBB,21:18"
"CCC,16:40"

并更改格式以将其另存为:

"['AAA,24:17']"
"['BBB,21:18']"
"['CCC,16:40']"

如果我再次运行代码,它会获取此数据并将其更改为:

"[""['AAA,24:17']""]"
"[""['BBB,21:18']""]"
"[""['CCC,16:40']""]"

如果我再次运行它,我最终会:

"['[""[\'AAA,24:17\']""]']"
"['[""[\'BBB,21:18\']""]']"
"['[""[\'CCC,16:40\']""]']"

1 个答案:

答案 0 :(得分:1)

csv Reader用于逐行解析文件,并为每个文件返回一个列表。 如果我们有一个像:

这样的文件
header1|header2
      1|      A
      2|      B

当我们使用" |"解析此csv文件时字符作为分隔符,我们得到:

[['header1', 'header2'], ['1', 'A'], ['2', 'B']]

这正是我们在这种情况下应该期待的。但是,如果我们用其他字符作为分隔符解析它,我们仍然会得到:

[['header1|header2'], ['1|    A'], ['2|    B']]

这就是你正在做的事情,因为你的csv阅读器已准备好期待&#34 ;;"的分隔符,而你的实际csv(显然)有"的分隔符, "

在使用阅读器阅读csv后,您将拥有一个列表列表,其中每个内部列表代表一行。把它想象成这样:

[
 row1,
 row2,
 row3
]

每行看起来像:

[cell1, cell2, cell3]

如果要为每一行添加新列,则必须遍历所有行:

for current_row in rows:
    # use current row here

并使用列表的.append()方法添加新列。

    current_row.append('new_value')

最后,您可以使用csv.writer将行写入另一个文件。见csv.writerows