2017-04-26 79 views
1

關於如何正確使用python csv模塊將數據寫回CSV文件的快速問題。目前我正在導入一個文件,拉動一列日期,並使用日期時間模塊製作一列days_of_the_week。然後我想寫出一個包含一個原始元素和新元素的新csv文件(或覆蓋單個文件)。python CSV寫入器 - 格式

with open('new_dates.csv') as csvfile2: 
    readCSV2 = csv.reader(csvfile2, delimiter=',') 
    incoming = [] 
    for row in readCSV2: 
     readin = row[0] 
     time = row[1] 
     year, month, day = (int(x) for x in readin.split('-')) 
     ans = datetime.date(year, month, day) 
     wkday = ans.strftime("%A") 
     incoming.append(wkday) 
     incoming.append(time) 
with open('new_dates2.csv', 'w') as out_file: 
    out_file.write('\n'.join(incoming)) 

輸入文件看起來是這樣的:

2017-03-02,09:25 
2017-03-01,06:45 
2017-02-28,23:49 
2017-02-28,19:34 

使用此代碼時我結束了,看起來像這樣的輸出文件:

Friday 
15:23 
Friday 
14:41 
Friday 
13:54 
Friday 
7:13 

我需要的是一個輸出文件看起來像這樣:

Friday,15:23 
Friday,14:41 
Friday,13:54 
Friday,7:13 

如果我將out_file.write中的分隔符更改爲逗號我只是每列獲得一個數據元素,如下所示:

Friday 15:23 Friday 14:41 Friday 13:54 .... 

任何想法將不勝感激。謝謝!

+1

問題可能是這個連接操作:''\ n'.join(incoming)'。嘗試用空格替換_ \ n_以獲得所需的輸出;對於真正的csv,使用_「,」_ – patrick

+0

使用空格會導致一個長行中的所有數據,而不是兩個CSV列。如前所述,逗號的使用會導致單個行中不同字段中的每個值。 – Justin

+0

輸入文件是什麼樣的? –

回答

0

看來你在C要Friday列0和列1中的時間,因此您需要將incoming更改爲列表列表。這意味着追加語句應該是這樣的:

... 
    incoming.append([wkday, time]) 
... 

然後,最好是使用csv.writer寫回文件。您可以一次編寫整個incoming,無需擔心格式化。

with open('new_dates2.csv', 'w') as out_file: 
    writer = csv.writer(out_file) 
    writer.writerows(incoming) 
+0

產生錯誤: 追溯(最近呼叫最後一個): 文件「./analyze.py」,第35行,在 out_file.write('\ n'.join(傳入)) TypeError:序列項目0:期望的字符串,找到列表 – Justin

+0

@Justin檢查答案,因爲它目前的立場 - 我編輯它。 – Stuart

+0

做到了,非常感謝! – Justin

1

對於您想要的格式有些不清楚,我假設您只需要wkdaytime之間的單個空格。對於一個快速解決,而不是追加兩wkdaytime分開,因爲在你的榜樣,附加在一起:

... 
    incoming.append('{} {}'.format(wkday,time)) 
... 

OR,建立自己的incoming作爲一個列表的列表:

... 
    incoming.append([wkday,time]) 
... 

和改變你寫:

with open('new_dates2.csv', 'w') as out_file: 
    out_file.write('\n'.join([' '.join(t) for t in incoming])) 
+0

使用該方法似乎會產生與用空格替換\ n相同的結果。所有的數據進入一個單一的領域。 – Justin

+0

第二個選項使一些更奇怪的結果。所有數據都在一個列中,每個字段都是一個字符。 – Justin

+0

@Justin對不起,錯過了一大塊 - 以上應該現在工作 –

0

您並不需要csv模塊。我猜在輸入端,但是從描述它看起來像:

2017-03-02,09:25 
2017-03-01,06:45 
2017-02-28,23:49 
2017-02-28,19:34 

這將解析它,它在一個新的格式寫:

import datetime 
with open('new_dates.csv') as f1, open('new_dates2.csv','w') as f2: 
    for line in f1: 
     dt = datetime.datetime.strptime(line.strip(),'%Y-%m-%d,%H:%M') 
     f2.write(dt.strftime('%A,%H:%M\n')) 

輸出文件:

Thursday,09:25 
Wednesday,06:45 
Tuesday,23:49 
Tuesday,19:34 
+0

這是假設輸入文件中沒有其他內容。 OP似乎也想要CSV輸出。 – Stuart

+0

@Stuart自從我寫了這個以後,問題發生了變化,但是,添加逗號只是對'strftime'的輕微修改。由於OP還添加了輸入,因此不需要假設。 –

0

基本上你的傳入數組是一個線性列表。所以,你應該做的事情就像下面這樣:

#your incoming array 
incoming = ['Friday', '15:23', 'Friday', '14:41', 'Friday', '13:54', 'Friday', '7:13'] 

#actual parsing of the array for correct output 
for i,j in zip(incoming[::2], incoming[1::2]): 
     out_file.write(','.join((i,j))) 
     out_file.write('\n')