【问题标题】:Converting a .csv.gz to .csv in Python 2.7在 Python 2.7 中将 .csv.gz 转换为 .csv
【发布时间】:2018-12-09 00:06:54
【问题描述】:

我已经阅读了关于 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 风格命名

【问题讨论】:

  • 顺便说一句,如果你不使用整个字典,你可以使用 ChainMap 并保存复制
  • 感谢您的帮助,但我相信 ChainMap 是 Python 3 的一个功能,遗憾的是我无法在这个特定项目中使用它。

标签: python python-2.7 csv dictionary gzip


【解决方案1】:

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

【讨论】:

  • 注意:如果文件编码可能与您的语言环境编码不匹配,请确保将 encoding='utf-8'(或 'latin-1',或 utf-16' 或任何文件的实际编码)传递给 gzip.open以确保它正确解码。
  • 非常感谢,我觉得这个问题很愚蠢,但我已经浪费了很多时间试图找出问题所在。 (是的,我的命名约定很烂)
  • 刚刚意识到问题是针对 Python 2 的,所以我做了一些更新来解决这两个问题。
【解决方案2】:

以下对我有用 python==3.7.9:

import gzip

my_filename = my_compressed_file.csv.gz

with gzip.open(my_filename, 'rt') as gz_file:
    data = gz_file.read() # read decompressed data
    with open(my_filename[:-3], 'wt') as out_file:
         out_file.write(data) # write decompressed data

my_filename[:-3] 是获取实际的文件名,以便它得到一个随机的文件名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2017-11-14
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2023-03-17
    • 2016-02-27
    相关资源
    最近更新 更多