2014-12-22 40 views
0

我有一個數據矩陣的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']]

因此,每次我的代碼運行時,它都會增加一層'li刺'。

我需要做些什麼來保持字符串列表的初始格式?我想這是因爲我用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\']""]']" 
+2

我想我們還需要看看您如何寫入文件。 – Kevin

+0

我很困惑你的意思是「下一次」。代碼中沒有循環,所以這隻會運行一次。也不清楚你是什麼「添加一列」,或如何。文件?列表?確保你向我們展示了所有相關的代碼。 – Brionius

+0

我想我們都可以同意我們需要查看代碼的其他相關部分(或者至少代表它們的示例代碼) – jamylak

回答

1

csv Reader是爲了逐行解析文件,併爲每個文件返回一個列表。 如果我們有像文件:

header1|header2 
     1|  A 
     2|  B 

當我們解析使用這個CSV文件「|」作爲分隔符,我們會得到:

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

這正是我們應該在這種情況下期望。然而,如果我們有一些其他的字符作爲分隔符解析的話,我們還是得到:

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

這是你在做什麼,因爲您的CSV讀者引到期望的分隔符「;」,而你的實際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