una ordenar operaciones linea leer exportar especifica crear con como columna archivos archivo abrir python csv

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=" ")