2011-10-21 18 views
14

Actualmente tengo un archivo CSV que, cuando se abre en Excel, tiene un total de 5 columnas. Solo las columnas A y C son importantes para mí y los datos en las columnas restantes son irrelevantes.Análisis del archivo txt CSV/tab-delimited con Python

Comenzando en la línea 8 y luego trabajando en múltiplos de 7 (es decir, las líneas 8, 15, 22, 29, 36 etc ...), estoy buscando crear un diccionario con Python 2.7 con la información de estos campos . Los datos en la columna A serán la clave (un entero de 6 dígitos) y los datos en la columna C serán el valor respectivo para la clave. He tratado de poner de relieve este continuación, pero el formato no es el mejor: -

A  B  C   D 
1       CDCDCDCD 
2       VDDBDDB 
3 
4 
5 
6 
7 DDEFEEF     FEFEFEFE 
8 123456   JONES 
9 
10 
11 
12 
13 
14 
15 293849   SMITH 

De acuerdo con lo anterior, estoy buscando para extraer el valor de la A7 (DDEFEEF) como una llave en el diccionario y " FEFEFEFE "siendo los datos respectivos y luego agregar otra entrada a mi diccionario, saltando a la línea 15 con" 2938495 "siendo mi clave y" Smith "siendo el valor respectivo.

¿Alguna sugerencia? El archivo fuente es un archivo .txt con entradas delimitadas por tabuladores. Gracias

Aclaración:

Solo para aclarar, hasta ahora, no han intentado el siguiente: -

import csv 

mydict = {:} 
f = open("myfile", 'rt') 
reader = csv.reader(f) 
    for row in reader: 
     print row 

Lo anterior simplemente imprime todo el contenido a través de una fila a la vez. Lo intenté "para la fila (7) en el lector", pero esto arrojó un error. entonces investigado y tenía un ir en el siguiente, pero no funcionó tampoco:

import csv 
from itertools import islice 

entries = csv.reader(open("myfile", 'rb')) 
mydict = {'key' : 'value'} 

for i in xrange(6): 
    mydict['i(0)] = 'I(2) # integers representing columns 
    range = islice(entries,6) 
    for entry in range: 
     mydict[entries(0) = entries(2)] # integers representing columns 
+0

@jdigital - pregunta original editado para contener lo que he probado hasta ahora – thefragileomen

+0

"a partir de la línea 8" no es compatible con "A7", "número entero de 6 dígitos" no es consistente con "DDEFEEF" - por favor edite su pregunta. –

+0

@John Machin - A7 no es la celda de la que quiero extraer los datos, es A8. Los datos en A7 son simplemente para darle un ejemplo de qué otros datos existen en mi archivo CSV. Como no es un número entero de 6 dígitos, debe ignorarse. Gracias – thefragileomen

Respuesta

43

de inicio girando el texto en una lista de listas. Que se hará cargo de la parte de análisis:

lol = list(csv.reader(open('text.txt', 'rb'), delimiter='\t')) 

El resto se puede hacer con las búsquedas indexadas:

d = dict() 
key = lol[6][0]  # cell A7 
value = lol[6][3] # cell D7 
d[key] = value  # add the entry to the dictionary 
... 
+2

Funcionó muy bien junto con un bucle for. Gracias – thefragileomen

2

Si el archivo es grande, es posible que no desea cargar por completo en la memoria a la vez . Este enfoque evita eso. (Por supuesto, hacer un diccionario de ella podría aún tener un poco de memoria RAM, pero se garantiza que sea más pequeño que el archivo original.)

my_dict = {} 
for i, line in enumerate(file): 
    if (i - 8) % 7: 
     continue 
    k, v = line.split("\t")[:3:2] 
    my_dict[k] = v 

Editar: No estoy seguro de dónde saqué extend de antes. Me refiero a update

+0

gracias por la respuesta. Intenté implementar lo anterior y obtener un "ValueError" en la línea final: "el elemento de secuencia de actualización del diccionario # 0 tiene longitud 1; 2 es obligatorio". ¿Alguna sugerencia? – thefragileomen

+0

@thefragileomen editado para un enfoque más legible que no requiere tres niveles de llaves para trabajar;) – kojiro

3

Aunque no hay nada de malo con las otras soluciones presentadas, puede simplificar y escalar sus soluciones utilizando las pandas de biblioteca excelentes de python.

Pandas es una biblioteca para el manejo de datos en Python, preferida por muchos Data Scientists.

Pandas tiene una interfaz CSV simplificada para leer y analizar archivos, que se puede utilizar para devolver una lista de diccionarios, cada uno con una sola línea del archivo. Las claves serán los nombres de columna y los valores serán los de cada celda.

En su caso:

import pandas 

    def create_dictionary(filename): 
     my_data = pandas.DataFrame.from_csv(filename, sep='\t', index_col=False) 
     # Here you can delete the dataframe collumns you dont want! 
     del my_data['B'] 
     del my_data['D'] 
     # ... 
     # Now you transform the DataFrame to a list of dictionaries 
     list_of_dicts = [item for item in my_data.T.to_dict().values()] 
     return list_of_dicts 

# Usage: 
x = create_dictionary("myfile.csv") 
Cuestiones relacionadas