【问题标题】:Bogus data in output CSV file输出 CSV 文件中的虚假数据
【发布时间】:2019-01-22 21:22:14
【问题描述】:

我正在尝试更改 CSV 上的分隔符并写入新文件,这只是一个简单的修改,但不是。

#!/usr/bin/python
#-*- econde: utf-8 -*-

import sys
import csv

def main():


    r = open(sys.argv[1],"r")
    wr = open(sys.argv[2],"a+")

    rea = csv.reader(r, delimiter=',')
    writer = csv.writer(wr,delimiter="|", quotechar="'")
    for row in rea:
        #line = str(row).replace(",","|")
        #writer.writerow("".join(line))
        writer.writerow(row)

    print type(row)
    print row
    r.close()
    wr.close()

if __name__ == '__main__':
    main()

更新:

控制台的输出看起来很像:

./csv_read.py fim.csv salida.csv
<type 'list'>
['9/17/18 22:29', 'any', 'la_cuerda.net', 'Sep 17 22:29:29 running yum[37144]: Installed: ImageMagic-toolkit-2.1.7-1.noarch']

但在文件中写入了 3 次相同的字符串,但以三种不同的方式

第一种方式还是一样:每个字段1个字符(包括错误的格式和括号)

第二种方法是在一个单元格中插入所有内容,而不像原来那样拆分它

这是输入文件和输出文件的内容

$ cat Input.csv
Time(GMT),Host,dest,Alert
9/17/18 22:34,any,google.com.mx,monitor: Agent started: 'discovery.channel.org->any'.
9/17/18 22:29,any,la_cuerda.net,Sep 17 22:29:29 running yum[37144]: Installed: ImageMagic-toolkit-2.1.7-1.noarch

$ cat Output.csv
[,'''',T,i,m,e,(,G,M,T,),'''',|, ,'''',H,o,s,t,'''',|, ,'''',d,e,s,t,'''',|, ,'-''',A,l,e,r,t,'''',]
[,'''',9,/,1,7,/,1,8, ,2,2,:,3,4,'''',|, ,'''',a,n,y,'''',|, ,'''',g,o,o,g,l,e,.,c,o,m,.,m,x,'''',|, ,",m,o,n,i,t,o,r,:, ,A,g,e,n,t, ,s,t,a,r,t,e,d,:, ,'''',d,i,s,c,o,v,e,r,y,.,c,h,a,n,n,e,l,.,o,r,g,-,>,a,n,y,'''',.,",]
[,'''',9,/,1,7,/,1,8, ,2,2,:,2,9,'''',|, ,'''',a,n,y,'''',|, ,'''',l,a,_,c,u,e,r,d,a,.,n,e,t,'''',|, ,'''',S,e,p, ,1,7, ,2,2,:,2,9,:,2,9, ,r,u,n,n,i,n,g, ,y,u,m,[,3,7,1,4,4,],:, ,I,n,s,t,a,l,l,e,d,:, ,I,m,a,g,e,M,a,g,i,c,-,t,o,o,l,k,i,t,-,2,.,1,.,7,-,1,.,n,o,a,r,c,h,'''',]
Time(GMT)|Host|dest|Alert
9/17/18 22:34|any|google.com.mx|'monitor: Agent started: ''discovery.channel.org->any''.'
9/17/18 22:29|any|la_cuerda.net|Sep 17 22:29:29 running yum[37144]: Installed: ImageMagic-toolkit-2.1.7-1.noarch
Time(GMT)|Host|dest|Alert
9/17/18 22:34|any|google.com.mx|'monitor: Agent started: ''discovery.channel.org->any''.'
9/17/18 22:29|any|la_cuerda.net|Sep 17 22:29:29 running yum[37144]: Installed: ImageMagic-toolkit-2.1.7-1.noarch
Time(GMT)|Host|dest|Alert
9/17/18 22:34|any|google.com.mx|'monitor: Agent started: ''discovery.channel.org->any''.'
9/17/18 22:29|any|la_cuerda.net|Sep 17 22:29:29 running yum[37144]: Installed: ImageMagic-toolkit-2.1.7-1.noarch

【问题讨论】:

  • 有趣的问题,首先,程序正在执行您编写的代码,这可能并不总是与您想要或期望它执行的操作一致。让我们开始分解它。当你在循环中打印row 时你看到了什么?
  • 如果您阅读 csv 的文档,您将看到您可以通过不执行更多 writer = csv.writer(wr,delimiter=‘*’,quotechar=“‘“) 来为 writer 指定分隔符,因此绝对不需要修改 line””.join(line) .另请阅读文档。并查看示例。然后编写示例代码并查看它们是否有效。然后逐步将它们扩展到您想要做的事情。
  • @ahed87 感谢您的回答,但控制台中的输出看起来不错 ['9/17/18 22:29'| '任何'| 'la_cuerda.net'| 'Sep 17 22:29:29 running yum[37144]: Installed: ImageMagic-toolkit-2.1.7-1.noarch'] 但仍将括号和引号以及每个字符作为每个字段单独插入
  • @barny 谢谢你的回答,我会试试你提到的好的我运行它,但现在写了 9 行,原来有 3 行,我不知道如何上传图片给你看文件上的输出,因为在控制台中看起来很好 ['9/17/18 22:29', 'any', 'la_cuerda.net', 'Sep 17 22:29:29 running yum[37144 ]:已安装:ImageMagic-toolkit-2.1.7-1.noarch'] rea = csv.reader(r, delimiter=',') writer = csv.writer(wr,delimiter="|", quotechar="'" ) for row in rea: writer.writerow(row) print type(row) print row
  • 编辑您的问题,显示您当前的代码及其输出,以及输入文件的一些行。

标签: python csv


【解决方案1】:

wr = open(sys.argv[2],"a+") 是原因。每次您运行程序时,它都会将其输出追加到文件中。您看到的虚假数据来自之前的运行。

除非您的程序确实应该附加到输出文件而不是覆盖它,否则open 文件处于wb 模式。

另请注意,csv.readercsv.writer 文档要求以二进制模式打开文件(因为模块应该进行自己的转码)。

【讨论】:

  • 这是真的,但仍然在一个单元格中写入所有内容,而不是在每个单元格中,但是是的,输出已更改
猜你喜欢
  • 2020-08-06
  • 1970-01-01
  • 2021-10-11
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2014-02-26
相关资源
最近更新 更多