【问题标题】:Python changing Comma Delimitation CSVPython 更改逗号分隔 CSV
【发布时间】:2018-06-01 09:41:49
【问题描述】:

NEWBIE 使用 PYTHON (2.7.9)- 当我使用以下方式将 gzip 压缩文件导出到 csv 时:

myData = gzip.open('file.gz.DONE', 'rb') 
myFile = open('output.csv', 'wb') with myFile:
        writer = csv.writer(myFile)
        writer.writerows(myData)    
print("Writing complete")

它在 csv 中打印,每个字符都用逗号分隔。例如。

S,V,R,","2,1,4,0,",",2,0,1,6,1,1,3,8,0,4,",",5,0,5,0,1,3,4,2,0,6,4,7,3,6,4,",",",",2,0,0,0,5,6,5,9,2,9,6,7,4,",",2,0,0,7,2,4,5,2,3,5,",",0,0,0,2,","
I,V,E,",",",",",",E,N,",",N,/,A,",",0,4,2,1,4,4,9,3,7,0,",":,I,R,_,",",N,/,A,",",U,N,A,N,S,W,",",",",",",",","
"
S,V,R,",",4,7,3,3,5,5,",",2,0,5,7,",",5,0,5,0,1,4,5,0,1,6,4,8,6,3,7,",",",",2,0,0,0,5,5,3,9,2,9,2,8,0,",",2,0,4,4,1,0,8,3,7,8,",",0,0,0,2,","
I,V,E,",",",",",",E,N,",",N,/,A,",",0,4,4,7,3,3,5,4,5,5,",",,:,I,R,_,",",N,/,A,",",U,N,A,N,S,W,",",",",",",",","

如何去掉逗号以便导出正确的字段?例如。

SVR,2144370,20161804,50501342364,,565929674,2007245235,0002,1,PPDAP,PPLUS,DEACTIVE,,,EN,N/A,214370,:IR_,N/A,,,,, SVR,473455,208082557,14501648637,,2000553929280,2044108378,0002,1,3G,CODAP,INACTIVE,,,EN,N/A,35455,:IR_,N/A,,,,,

【问题讨论】:

  • 听起来像是类型不匹配。也许 writerows() 期望一个可迭代但 myData 实际上是一个字符串?
  • 感谢 nick 先生,但这不起作用 writer.writerows() 需要只接受一个参数
  • 如果您按照此处的建议将myData 作为list(例如writer.writerows([myData]))传递怎么办:Why does csvwriter.writerow() put a comma after each character?
  • 没有——“writer.writerows[myData]”和“writer.writerows([myData])”都试过了

标签: python csv


【解决方案1】:

您只是打开 gzip 文件。我认为您期望打开的文件像迭代器一样自动运行。它确实如此。然而,每一行都是一个文本字符串。 writerows 期望一个迭代器,其中每个项目都是一个值数组,以逗号分隔写入。因此,给定一个迭代器,每个项目都是一个字符串,并且给定一个字符串是一个字符数组,您将得到您找到的结果。

由于您没有提到 gzip 数据行真正包含的内容,我无法猜测如何将这些行解析为一组合理的块。但是假设一个名为“split_line”的函数适合该数据,您可以这样做

with gzip.open('file.gz.Done', 'rb') as gzip_f:
  data = [split_line(l) for l in gzip_f]
  with open('output.csv', 'wb') as myFile:
    writer = csv.writer(myFile)
    writer.writerows(data)
    print("Writing complete")

当然,在这一点上,一行一行地把 with 线放在一起是有意义的。

见https://docs.python.org/2/library/csv.html

【讨论】:

  • 谢谢萨曼莎。 gzip 数据包含 14,000 行,每行包含 21 个逗号分隔字段...例如。 SVR,370,2011143804,05047364,,2056599674,200724525,0002,1,G,PPPCODAP,3LUS,DIVE,,,EN,N/A,0421449370,DS:IR_SMS,N/A,UW,,,, 您的建议返回“NameError:名称'split_line'未定义”??
  • 当然可以。我说“假设有一个名为 split_line 的函数..”。如果您的 gzip 数据已经用逗号分隔,那么为什么不直接将其写出来而不是与 csv 编写器鬼混呢?
  • csv 表示逗号分隔值。这是你已经拥有的。请参阅下面的新答案。
【解决方案2】:

我认为这仅仅是因为gzip.open() 会给你一个类似文件的对象,但csvwriter.writerows() 需要一个字符串列表来完成它的工作。

但我不明白你为什么要使用csv 模块。您看起来只想提取 gzip 文件的内容并将其保存在未压缩的输出文件中。你可以这样做:

import gzip

input_file_name = 'file.gz.DONE'
output_file_name = 'output.csv'

with gzip.open(input_file_name, 'rt') as input_file:
    with open('output.csv', 'wt') as output_file:
        for line in input_file:
            output_file.write(line)

print("Writing complete")

如果您想使用 csv 模块,因为您不确定输入数据的格式是否正确(并且您希望立即收到错误消息),那么您可以这样做:

import gzip
import csv

input_file_name = 'file.gz.DONE'
output_file_name = 'output.csv'

with gzip.open(input_file_name, 'rt', newline='') as input_file:
    reader_csv = csv.reader(input_file)
    with open('output.csv', 'wt', newline='') as output_file:
        writer_csv = csv.writer(output_file)
        writer_csv.writerows(reader_csv)

print("Writing complete")

这就是你想要做的吗?很难猜测,因为我们没有要理解的输入文件。

如果不是你想要的,你能澄清一下你想要什么吗?

【讨论】:

    【解决方案3】:

    由于我现在有信息,gzip 压缩的文件本身就是逗号,分隔值因此简化了..

    with gzip.open('file.gz.DONE', 'rb') as gzip_f, open('output.csv', 'wb') as myFile:
      myfile.write(gzip_f.read())
    

    换句话说,它只是一个关于 gunzip 到另一个文件的回合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 2016-03-13
      • 2020-09-26
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多