2010-01-20 47 views
19

Quiero ordenar una tabla CSV por fecha. Empecé siendo una tarea simple:ordenar csv por columna

import sys 
import csv 

reader = csv.reader(open("files.csv"), delimiter=";") 

for id, path, title, date, author, platform, type, port in reader: 
    print date 

Solía ​​módulo CSV de Python para leer en un archivo con esa estructura:

id;file;description;date;author;platform;type;port 
  • La fecha es la norma ISO-8601, por lo tanto puedo solucionarlo bastante fácilmente sin analizar: 2003-04-22 e. gramo.
  • Quiero ordenar la fecha, las entradas más nuevas primero
  • ¿Cómo puedo obtener este lector en una estructura de datos clasificable? Creo que con un poco de esfuerzo podría hacer un datelist: datelist + = date, split y sort. Sin embargo, tengo que volver a identificar la entrada completa en la tabla CSV. No es solo ordenar una lista de cosas. no parece que han construido en función de clasificación

La solución óptima sería tener un cliente CSV que maneja el archivo de base de datos como un

  • csv. No encontré nada de eso.

    espero que alguien conoce algún buen magia de clasificación aquí;)

    Gracias,

    Marius

  • +2

    Si simplemente desea una herramienta para ordenar archivos CSV, consulte mi csvfix de proyecto FOSS en http://code.google.com/p/csvfix/ –

    Respuesta

    47
    import operator 
    sortedlist = sorted(reader, key=operator.itemgetter(3), reverse=True) 
    

    o el uso de lambda

    sortedlist = sorted(reader, key=lambda row: row[3], reverse=True) 
    
    +0

    ¿Esto vuelve a escribir el archivo, o simplemente guarda la lista ordenada en ¿La variable? – Jeff

    +1

    @Jeff: no toca el archivo original. Si desea escribir los resultados, debe hacerlo como una operación separada. –

    +0

    @ IgnacioVazquez-Abrams ¿Cuál es la diferencia entre estos dos métodos? ¿Qué están haciendo? ¿Cuál debería elegir? – abaumg

    11

    El lector actúa como un generador. En un archivo de datos con un poco de falsa:

    >>> import sys, csv 
    >>> data = csv.reader(open('data.csv'),delimiter=';') 
    >>> data 
    <_csv.reader object at 0x1004a11a0> 
    >>> data.next() 
    ['a', ' b', ' c'] 
    >>> data.next() 
    ['x', ' y', ' z'] 
    >>> data.next() 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    StopIteration 
    

    Usando operator.itemgetter como Ignacio sugiere:

    >>> data = csv.reader(open('data.csv'),delimiter=';') 
    >>> import operator 
    >>> sortedlist = sorted(data, key=operator.itemgetter(2), reverse=True) 
    >>> sortedlist 
    [['x', ' y', ' z'], ['a', ' b', ' c']] 
    
    2

    en caso de varias columnas de clasificación:

    with open('xxx.csv',newline='') as csvfile: 
        spamreader = csv.DictReader(csvfile, delimiter=";") 
        sortedlist = sorted(spamreader, key=lambda row:(row['title'],row['date']), reverse=False) 
    

    Sería primera clasificación por title, y luego ordenar por date.