从Python中的url读取gzip csv时出错:“_csv.Error:line contains NULL byte”

时间:2015-08-23 18:48:42

标签: python csv gzip urllib2 urlopen

我正在尝试从网址中读取gzip压缩文件。这是一个超过50.000行的非常大的文件。当我尝试下面的代码时出现错误:_csv.Error: line contains NULL byte

import csv
import urllib2   
url = '[my-url-to-csv-file].gz'
response = urllib2.urlopen(url)
cr = csv.reader(response)

for row in cr:
    if len(row) <= 1: continue
        print row

如果我在尝试阅读之前尝试打印文件的内容,我会得到类似的结果:

  

M +}?7 M + == ?? 7M ??? Z'YJ ????? 5 {次?JK ?? 3b中&Delta; P?      

[= J&安培;?????= ???? = 0U'???} mwBt ?? - 电子M2 +Ծ?????? WM ?? WJ ??ž ?? EE?d?VF ???? 4 = Y?Y'TA ???

如何正确读取此网址中的gzip压缩文件?

2 个答案:

答案 0 :(得分:2)

如何使用urllib2.urlopen

从网址打开.gz(gzip)csv文件
  1. 将URL数据保存到文件对象。为此,您可以使用StringIO.StringIO()
  2. 使用gzip.Gzipfile()解压缩.gz。
  3. 从新文件对象中读取数据。
  4. 使用您的示例:

    from StringIO import StringIO
    import gzip
    import urllib2
    
    url = '[my-url-to-csv-file].gz'
    mem = StringIO(urlopen(url).read())
    f = gzip.GzipFile(fileobj=mem, mode='rb')
    data = f.read()
    
    for line in data:
      print line
    

答案 1 :(得分:0)

使用try和except,如果您不关心遇到NULL行时会发生什么,只需使用pass

for row in cr:
    try:
        if len(row) <= 1: continue
            print row
    except Exception, e:
        print e
        #or if you're not worried about errors, you can use pass