在Python 2.7中将.csv.gz转换为.csv

时间:2018-06-29 18:47:09

标签: python python-2.7 csv dictionary gzip

我已经阅读了文档以及关于SO和其他地方的一些其他文章,但是我不太清楚这个概念:

当您依次呼叫csvFilename = gzip.open(filename, 'rb')reader = csv.reader(open(csvFilename))时,reader不是有效的csv文件吗?

我正在尝试解决下面概述的问题,并且在第41行和第7行上出现coercing to Unicode: need string or buffer, GzipFile found错误(下面突出显示),这使我相信gzip.open和csv.reader无法正常工作我以前曾想过。

我正在尝试解决的问题

我正在尝试使用results.csv.gz并将其转换为results.csv,以便可以将results.csv转换为python字典,然后将其与另一个python字典结合。

文件1:

alertFile = payload.get('results_file')
alertDataCSV = rh.dataToDict(alertFile) # LINE 41
alertDataTotal = rh.mergeTwoDicts(splunkParams, alertDataCSV)

调用文件2:

import gzip
import csv

def dataToDict(filename):
    csvFilename = gzip.open(filename, 'rb')
    reader = csv.reader(open(csvFilename)) # LINE 7
    alertData={}
    for row in reader:
        alertData[row[0]]=row[1:]
    return alertData

def mergeTwoDicts(dictA, dictB):
    dictC = dictA.copy()
    dictC.update(dictB)
    return dictC

* edit:也可以原谅我在Python中的非PEP命名方式

1 个答案:

答案 0 :(得分:2)

gzip.open返回类似于文件的对象(与普通open返回的对象相同),而不是解压缩文件的名称。只需将结果直接传递给csv.reader,它将起作用(csv.reader将收到解压缩的行)。 csv确实需要文本,因此在Python 3上,您需要将其打开以读取为文本(在Python 2上,'rb'很好,该模块不处理编码,但是csv模块)。只需更改:

csvFilename = gzip.open(filename, 'rb')
reader = csv.reader(open(csvFilename))

收件人:

# Python 2
csvFile = gzip.open(filename, 'rb')
reader = csv.reader(csvFile)  # No reopening involved

# Python 3
csvFile = gzip.open(filename, 'rt', newline='')  # Open in text mode, not binary, no line ending translation
reader = csv.reader(csvFile)  # No reopening involved