2015-11-05 73 views
1

下面的代碼片段比較兩個csv文件併合並它們。我的問題是第二個文件以新行打印。避免python輸出中的換行

import csv 
import dateutil.parser 

with open('a.csv', 'r') as f1: 
    feed = f1.readlines() 

with open ('b.csv', 'r') as f2: 
    for line in f2.readlines()[1:]: 
     line = line.split(',') 
     ts = dateutil.parser.parse(line[3]) 
     print(ts) 
     for i, log in enumerate(feed): 
     ls = log.split(',') 
     ts_start = dateutil.parser.parse(ls[0]) 
     ts_end = dateutil.parser.parse(ls[1]) 
     if (ts >= ts_start) and (ts < ts_end): 
      print(ts, ts_start, ts_end) 
      name, tags, mean = line[0], ','.join(line[1:3]),line[-1] 
      feed[i] = ','.join([log, name, tags, mean]) 

with open('c.csv', 'w') as f: 
f.writelines(feed) 

文件:

2015-11-04T13:35:18.657Z,2015-11-04T13:47:06.588Z,load,INSERT 
2015-11-04T13:47:47.164Z,2015-11-04T14:07:13.230Z,run,READUPDATE 

文件B:

name,tags,time,mean 
memory_value,"type=memory,instance=buffered",2015-11-04T13:35:00Z, 
memory_value,"type=memory,instance=buffered",2015-11-04T13:45:00Z,1.32  
memory_value,"type=memory,instance=buffered",2015-11-04T14:05:00Z,1.11 

輸出:

A1,A2,A3,A4, 
A5 
B1,B2,B3,B4, 
B5, 

預期輸出:

A1,A2,A3,A4,A5 
B1,B2,B3,B4,B5 

我該如何實現這個目標?

感謝

+0

「輸出」,你的意思是「c.csv的內容」,或「什麼打印到標準輸出」? – Kevin

+0

@凱文在c.csv。 – arazx

+0

您能否提供a.csv和b.csv的樣本副本? – Kevin

回答

1

readlines返回的列表中的字符串在每行末尾包含換行符,因此可能會在您對該數據執行字符串操作時被無意中包含這些字符串。特別地,','.join([log, name, tags, mean])將在logname之間具有換行符,因爲log最終來自f1.readlines()

嘗試從每行中剝離換行符,然後再做任何事情。

for i, log in enumerate(feed): 
    log = log.strip() 
    ls = log.split(',') 

也可能有必要在第一個for循環,而不是僅僅line = line.split(',')的頂部做line = line.strip().split(',')。輸出在我的機器上看起來沒有問題,但我不能100%確定它完全符合您所需的輸出。

+0

謝謝凱文。只有一個問題。現在兩條線都是一條。我的意思是第二行「2015-10-04 -....」也在第一行之後繼續,而在第一行之後應該出現在新行中。 – arazx

+0

如果將最後一行更改爲'f.write(「\ n」.join(feed))'',會發生什麼? – Kevin

+0

它工作。謝謝! – arazx

0

取決於你使用的是什麼版本的Python,你可能需要改變「R」和「W」到「RB」和「WB」,以便閱讀和以二進制方式寫入文件。這應該有助於新的線路。