【问题标题】:Read CSV from within Zip File从 Zip 文件中读取 CSV
【发布时间】:2012-03-09 18:36:36
【问题描述】:

我有一个 zip 文件目录(大约 10,000 个小文件),每个目录中都有一个 CSV 文件,我正在尝试读取并拆分为多个不同的 CSV 文件。

我设法编写代码将 CSV 文件从 CSV 目录中拆分出来,如下所示,它读取 CSV 的第一个属性,并根据将其写入相关 CSV 的内容。

import csv
import os
import sys
import re
import glob

reader = csv.reader(open("C:/Projects/test.csv", "rb"), delimiter=',', quotechar='"')
write10 = csv.writer(open('ouput10.csv', 'w'), delimiter=',', lineterminator='\n', quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
write15 = csv.writer(open('ouput15.csv', 'w'), delimiter=',', lineterminator='\n', quotechar='"', quoting=csv.QUOTE_NONNUMERIC)


headings10=["RECORD_IDENTIFIER","CUSTODIAN_NAME","LOCAL_CUSTODIAN_NAME","PROCESS_DATE","VOLUME_NUMBER","ENTRY_DATE","TIME_STAMP","VERSION","FILE_TYPE"]
write10.writerow(headings10)

headings15=["RECORD_IDENTIFIER","CHANGE_TYPE","PRO_ORDER","USRN","STREET_DESCRIPTION","LOCALITY_NAME","TOWN_NAME","ADMINSTRATIVE_AREA","LANGUAGE"]
write15.writerow(headings15)


for row in reader:
    type = row[0]
    if "10" in type:        
        write10.writerow(row)
    elif "15" in type:
        write15.writerow(row)

所以我现在尝试读取 Zip 文件,而不是浪费时间先提取它们。

这是我在学习了尽可能多的教程之后所拥有的

import glob
import os
import csv
import zipfile
import StringIO

for name in glob.glob('C:/Projects/abase/*.zip'):
    base = os.path.basename(name)
    filename = os.path.splitext(base)[0]


datadirectory = 'C:/Projects/abase/'
dataFile = filename
archive = '.'.join([dataFile, 'zip'])
fullpath = ''.join([datadirectory, archive])
csv = '.'.join([dataFile, 'csv'])


filehandle = open(fullpath, 'rb')
zfile = zipfile.ZipFile(filehandle)
data = StringIO.StringIO(zfile.read(csv))
reader = csv.reader(data)

for row in reader:
    print row

但是会抛出错误

AttributeError: 'str' 对象没有属性 'reader'

希望有人能告诉我如何更改我的 CSV 读取代码以读取 Zip 文件。

非常感谢

提姆

【问题讨论】:

  • 也许这是您粘贴代码的方式,但您的 for 名称循环中几乎没有任何内容。错误指的是哪一行?

标签: python csv zip


【解决方案1】:

简单的修复。您正在使用本地 csv 变量覆盖 csv 模块。只需更改该变量的名称:

import glob
import os
import csv
import zipfile
import StringIO

for name in glob.glob('C:/Projects/abase/*.zip'):
    base = os.path.basename(name)
    filename = os.path.splitext(base)[0]


    datadirectory = 'C:/Projects/abase/'
    dataFile = filename
    archive = '.'.join([dataFile, 'zip'])
    fullpath = ''.join([datadirectory, archive])
    csv_file = '.'.join([dataFile, 'csv']) #all fixed


    filehandle = open(fullpath, 'rb')
    zfile = zipfile.ZipFile(filehandle)
    data = StringIO.StringIO(zfile.read(csv_file)) #don't forget this line!
    reader = csv.reader(data)

    for row in reader:
        print row

【讨论】:

  • 但是,它似乎没有循环通过 zip 文件?
  • @user1218419:检查你的缩进。正如 Scott Hunter 所指出的,您的大部分代码都在您的 for name in glob.glob('c:etc'): 循环下方,因此在您的 for name in glob.glob('c:etc'): 循环之外。
  • 像梦一样工作,在 1 小时 40 分钟内完成了 7000 个文件,而使用 gawk 则需要 28 小时!!!
  • StringIO 在 Python 3 的 io 包中。
猜你喜欢
  • 2021-07-05
  • 2021-07-04
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多