我已经阅读了文档以及关于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命名方式
答案 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