2012-02-18 19 views
16

Tengo un directorio de archivos zip (aproximadamente 10,000 archivos pequeños), dentro de cada uno de ellos se encuentra un archivo CSV que estoy tratando de leer y dividir en varios archivos CSV diferentes.Leer archivos CSV desde el archivo Zip

Me las arreglé para escribir el código para dividir los archivos CSV de un directorio de CSV, que se muestra a continuación, que lee el primer atttribute del CSV, y dependiendo de qué se lo escriba al CSV relevante.

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) 

Así que ahora estoy tratando de leer los archivos Zip en lugar de perder el tiempo extraerlos primero.

Esto es lo que tengo hasta ahora después de seguir la mayor cantidad de tutoriales que he encontrado

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 

Sin embargo y error se tira

AttributeError: objeto 'str' no tiene atributo 'lector'

Espero que alguien me puede mostrar cómo cambiar mi código de lectura CSV que funciona para leer el archivo Zip.

muy apreciada

Tim

+0

Tal vez así es como pegó el código, pero casi no hay nada en su bucle for name. ¿A qué línea se refiere el error? –

Respuesta

19

arreglo simple. Está anulando el módulo csv con su variable local csv. Simplemente cambie el nombre de esa variable:

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 
+0

Eso brilla brillantemente. – tjmgis

+0

Sin embargo, parece que no recorre los archivos zip. – tjmgis

+0

@ user1218419: verifique su sangría. Como señaló Scott Hunter, la mayor parte de su código está debajo, y por lo tanto fuera de, su bucle 'for name in glob.glob ('c: etc'):'. – DSM

Cuestiones relacionadas