ordenar - leer una linea especifica de un archivo en python
Leer columnas específicas de un archivo csv con módulo csv? (7)
Con pandas puedes usar read_csv
con el parámetro usecols
:
df = pd.read_csv(filename, usecols=[''col1'', ''col3'', ''col7''])
Ejemplo:
import pandas as pd
import io
s = ''''''
total_bill,tip,sex,smoker,day,time,size
16.99,1.01,Female,No,Sun,Dinner,2
10.34,1.66,Male,No,Sun,Dinner,3
21.01,3.5,Male,No,Sun,Dinner,3
''''''
df = pd.read_csv(io.StringIO(s), usecols=[''total_bill'', ''day'', ''size''])
print(df)
total_bill day size
0 16.99 Sun 2
1 10.34 Sun 3
2 21.01 Sun 3
Estoy tratando de analizar a través de un archivo csv y extraer los datos de solo columnas específicas.
Ejemplo csv:
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
Intento capturar solo columnas específicas, por ejemplo ID
, Name
, Zip
y Phone
.
El código que he analizado me ha llevado a creer que puedo llamar a la columna específica por su número correspondiente, es decir: el Name
correspondería a 2
e iterar a través de cada fila usando la row[2]
produciría todos los elementos en la columna 2. Solo no es así
Esto es lo que hice hasta ahora:
import sys, argparse, csv
from settings import *
# command arguments
parser = argparse.ArgumentParser(description=''csv to postgres'',/
fromfile_prefix_chars="@" )
parser.add_argument(''file'', help=''csv file to import'', action=''store'')
args = parser.parse_args()
csv_file = args.file
# open csv file
with open(csv_file, ''rb'') as csvfile:
# get number of columns
for line in csvfile.readlines():
array = line.split('','')
first_item = array[0]
num_columns = len(array)
csvfile.seek(0)
reader = csv.reader(csvfile, delimiter='' '')
included_cols = [1, 2, 6, 7]
for row in reader:
content = list(row[i] for i in included_cols)
print content
y estoy esperando que esto imprima solo las columnas específicas que quiero para cada fila, excepto que no, obtengo la última columna solamente.
Contexto: para este tipo de trabajo, debe usar la increíble biblioteca petl python. Eso le ahorrará mucho trabajo y la posible frustración de hacer las cosas "manualmente" con el módulo csv estándar. AFAIK, las únicas personas que todavía usan el módulo csv son aquellas que aún no han descubierto mejores herramientas para trabajar con datos tabulares (pandas, petl, etc.), lo cual está bien, pero si planeas trabajar con una gran cantidad de datos en su carrera de diversas fuentes extrañas, aprender algo como petl es una de las mejores inversiones que puede hacer. Para comenzar solo debe tomar 30 minutos después de haber hecho la instalación de pip petl. La documentación es excelente.
Respuesta: Supongamos que tiene la primera tabla en un archivo csv (también puede cargar directamente desde la base de datos utilizando petl). Luego, simplemente cárguelo y haga lo siguiente.
from petl import fromcsv, look, cut, tocsv
#Load the table
table1 = fromcsv(''table1.csv'')
# Alter the colums
table2 = cut(table1, ''Song_Name'',''Artist_ID'')
#have a quick look to make sure things are ok. Prints a nicely formatted table to your console
print look(table2)
# Save to new file
tocsv(table2, ''new.csv'')
La única forma en que obtendría la última columna de este código es si no incluye su declaración de impresión en su bucle for
.
Este es probablemente el final de tu código:
for row in reader:
content = list(row[i] for i in included_cols)
print content
Quieres que sea esto:
for row in reader:
content = list(row[i] for i in included_cols)
print content
Ahora que hemos cubierto su error, me gustaría aprovechar esta oportunidad para presentarle el módulo pandas .
Pandas es espectacular para tratar con archivos csv, y el siguiente código sería todo lo que necesita para leer un csv y guardar una columna completa en una variable:
import pandas as pd
df = pd.read_csv(csv_file)
saved_column = df.column_name #you can also use df[''column_name'']
por lo tanto, si desea guardar toda la información en los Names
columna en una variable, esto es todo lo que necesita hacer:
names = df.Names
Es un gran módulo y te sugiero que lo analices. Si por alguna razón su declaración impresa estaba en bucle y todavía estaba imprimiendo la última columna, lo cual no debería suceder, pero avíseme si mi suposición era incorrecta. El código publicado tiene muchos errores de sangría, por lo que era difícil saber dónde se suponía que estaba. Espero que esto haya sido útil.
Para recuperar el nombre de la columna , en lugar de usar readlines (), mejor utilizar readline () para evitar el bucle y leer el archivo completo y almacenarlo en la matriz.
with open(csv_file, ''rb'') as csvfile:
# get number of columns
line = csvfile.readline()
first_item = line.split('','')
Puedes usar numpy.loadtext(filename)
. Por ejemplo, si esta es su base de datos .csv
:
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | Adam | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
10 | Carl | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
10 | Adolf | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
10 | Den | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
Y quieres la columna Name
:
import numpy as np
b=np.loadtxt(r''filepath/name.csv'',dtype=str,delimiter=''|'',skiprows=1,usecols=(1,))
>>> b
array(['' Adam '', '' Carl '', '' Adolf '', '' Den ''],
dtype=''|S7'')
Más fácilmente puedes usar genfromtext
:
b = np.genfromtxt(r''filepath/name.csv'', delimiter=''|'', names=True,dtype=None)
>>> b[''Name'']
array(['' Adam '', '' Carl '', '' Adolf '', '' Den ''],
dtype=''|S7'')
Usa pandas :
import pandas as pd
my_csv = pd.read_csv(filename)
column = my_csv.column_name
# you can also use my_csv[''column_name'']
Una solución un poco más amigable con la memoria, si realmente necesita esos bytes (tira las columnas innecesarias en el momento de análisis):
my_filtered_csv = pd.read_csv(filename, usecols=[''col1'', ''col3'', ''col7''])
PD. Estoy agregando lo que otros han dicho de una manera simple. Las respuestas reales se toman de here y here .
import csv
from collections import defaultdict
columns = defaultdict(list) # each value in each column is appended to a list
with open(''file.txt'') as f:
reader = csv.DictReader(f) # read rows into a dictionary format
for row in reader: # read a row as {column1: value1, column2: value2,...}
for (k,v) in row.items(): # go over each column name and value
columns[k].append(v) # append the value into the appropriate list
# based on column name k
print(columns[''name''])
print(columns[''phone''])
print(columns[''street''])
Con un archivo como
name,phone,street
Bob,0893,32 Silly
James,000,400 McHilly
Smithers,4442,23 Looped St.
Producirá
>>>
[''Bob'', ''James'', ''Smithers'']
[''0893'', ''000'', ''4442'']
[''32 Silly'', ''400 McHilly'', ''23 Looped St.'']
O, como alternativa, si desea una indexación numérica para las columnas:
with open(''file.txt'') as f:
reader = csv.reader(f)
reader.next()
for row in reader:
for (i,v) in enumerate(row):
columns[i].append(v)
print(columns[0])
>>>
[''Bob'', ''James'', ''Smithers'']
Para cambiar el delimiter=" "
agregue delimiter=" "
a la instanciación apropiada, es decir, reader = csv.reader(f,delimiter=" ")