【问题标题】:Avoid newline in python output在 python 输出中避免换行
【发布时间】:2016-02-06 10:45:41
【问题描述】:

下面的代码 sn-p 比较两个 csv 文件并将它们合并。我的问题是第二个文件以新行打印。

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

我怎样才能做到这一点?

谢谢

【问题讨论】:

  • “输出”是指“c.csv 的内容”还是“打印到标准输出的内容”?
  • 您能提供 a.csv 和 b.csv 的样本副本吗?
  • 请在问题中提供文件作为代码块,而不是作为外部链接。
  • 您正在导入 csv 模块,但实际上并没有在代码中使用它。您可能想要这样做,因为它可以确保您在输出中获得正确的换行符。但是请注意,它确实对如何打开文件有一些要求(您需要在 Python 2 中以二进制模式打开,或在 Python 3 中使用 newline="")。
  • 一些题外话:永远不要使用for line in file.readlines(),而是使用for line in file。同样,您也可以在 for 循环中逐行编写 (f.write('%s\n' % feed))。这样您就不会将所有数据加载到内存中,并且会摆脱尾随的\n

标签: python csv merge compare


【解决方案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.strip().split(',') 而不仅仅是 line = line.split(',')。没有它,我的机器上的输出看起来不错,但我不能 100% 确定它与您想要的输出完全匹配。

【讨论】:

  • 谢谢凯文。只有一个问题。现在两条线合二为一。我的意思是第二行“2015-10-04-....”也在第一行之后继续,而应该出现在新行的第一行之后。
  • 如果将最后一行更改为`f.write("\n".join(feed))`会发生什么?
【解决方案2】:

根据您使用的 python 版本,您可能需要将 'r' 和 'w' 更改为 'rb' 和 'wb' 以便以二进制模式读取和写入文件。这应该有助于新线路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多