2015-11-05 103 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”,以便阅读和以二进制方式写入文件。这应该有助于新的线路。