write reading read python3 leer how dictreader create python csv comments

reading - python writing to csv



Python: omita las lĂ­neas de comentario marcadas con#en csv.DictReader (2)

El procesamiento de archivos CSV con csv.DictReader es genial, pero tengo archivos CSV con líneas de comentarios (indicadas por un hash al inicio de una línea), por ejemplo:

# step size=1.61853 val0,val1,val2,hybridisation,temp,smattr 0.206895,0.797923,0.202077,0.631199,0.368801,0.311052,0.688948,0.597237,0.402763 -169.32,1,1.61853,2.04069e-92,1,0.000906546,0.999093,0.241356,0.758644,0.202382 # adaptation finished

El módulo csv no incluye ninguna forma de omitir tales líneas .

Podría hacer algo raro, pero me imagino que hay una buena manera de ajustar un csv.DicReader alrededor de otro objeto iterador, que preprocesa descartar las líneas.


Buena pregunta y un buen ejemplo de cómo la biblioteca CSV de Python carece de una funcionalidad importante, como el manejo de comentarios básicos (no poco común en la parte superior de los archivos CSV). Si bien la solución de Dan Stowell funciona para el caso específico del OP, está limitada porque # debe aparecer como primer símbolo. Una solución más genérica sería:

def decomment(csvfile): for row in csvfile: raw = row.split(''#'')[0].strip() if raw: yield raw with open(''dummy.csv'') as csvfile: reader = csv.reader(decomment(csvfile)) for row in reader: print(row)

Como ejemplo, el siguiente archivo dummy.csv :

# comment # comment a,b,c # comment 1,2,3 10,20,30 # comment

devoluciones

[''a'', ''b'', ''c''] [''1'', ''2'', ''3''] [''10'', ''20'', ''30'']

Por supuesto, esto funciona igual de bien con csv.DictReader() .


En realidad, esto funciona muy bien con el filter :

import csv fp = open(''samples.csv'') rdr = csv.DictReader(filter(lambda row: row[0]!=''#'', fp)) for row in rdr: print(row) fp.close()