importar - leer columnas en python
¿Cuál es la forma pitónica de leer los datos de archivo CSV como filas de namedtuples? (2)
Por favor, eche un vistazo a csv.DictReader
. Básicamente, proporciona la capacidad de obtener los nombres de las columnas de la primera fila como lo está buscando y, después de eso, le permite acceder a cada columna en una fila por nombre usando un diccionario.
Si por alguna razón aún necesita acceder a las filas como collections.namedtuple
, debería ser fácil transformar los diccionarios a tuplas con nombre de la siguiente manera:
with open(''data_file.txt'') as infile:
reader = csv.DictReader(infile)
Data = collections.namedtuple(''Data'', reader.fieldnames)
tuples = [Data(**row) for row in reader]
¿Cuál es la mejor manera de tomar un archivo de datos que contiene una fila de encabezado y leer esta fila en una tupla nombrada para que se pueda acceder a las filas de datos por el nombre del encabezado?
Estaba intentando algo así:
import csv
from collections import namedtuple
with open(''data_file.txt'', mode="r") as infile:
reader = csv.reader(infile)
Data = namedtuple("Data", ", ".join(i for i in reader[0]))
next(reader)
for row in reader:
data = Data(*row)
El objeto lector no es subscripble, por lo que el código anterior arroja un TypeError
. ¿Cuál es la forma pitónica de leer un encabezado de archivo en una ruta de acceso nombrada?
Utilizar:
Data = namedtuple("Data", next(reader))
y omite la línea:
next(reader)
Combinando esto con una versión iterativa basada en el comentario de martineau a continuación, el ejemplo se convierte en Python 2
import csv
from collections import namedtuple
from itertools import imap
with open("data_file.txt", mode="rb") as infile:
reader = csv.reader(infile)
Data = namedtuple("Data", next(reader)) # get names from column headers
for data in imap(Data._make, reader):
print data.foo
# ...further processing of a line...
y para Python 3
import csv
from collections import namedtuple
with open("data_file.txt", newline="") as infile:
reader = csv.reader(infile)
Data = namedtuple("Data", next(reader)) # get names from column headers
for data in map(Data._make, reader):
print(data.foo)
# ...further processing of a line...