J'essaie d'analyser un fichier csv et d'extraire les données de colonnes spécifiques uniquement.
Exemple csv:
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
Je suis en train de saisir uniquement des colonnes spécifiques, par exemple ID
, Name
, Zip
etPhone
.
Le code que j'ai regardé m'a amené à croire que je peux appeler la colonne spécifique par son numéro correspondant, donc c'est-à-dire: Name
correspondrait à2
et itérer à travers chaque ligne en utilisant row[2]
produirait tous les éléments de la colonne 2. Seulement, ce n'est pas le cas.
Voici ce que j'ai fait jusqu'à présent:
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
et je m'attends à ce que cela n'imprime que les colonnes spécifiques que je veux pour chaque ligne sauf que ce n'est pas le cas, je reçois la dernière colonne uniquement.
'rb'
signaleropen()
? ne devrait-il pas être simpler
?"rb"
est approprié pour le passagecsv.reader
.Réponses:
La seule façon d'obtenir la dernière colonne de ce code est de ne pas inclure votre instruction d'impression dans votre
for
boucle.C'est probablement la fin de votre code:
Vous voulez que ce soit ceci:
Maintenant que nous avons couvert votre erreur, j'aimerais profiter de ce temps pour vous présenter le module pandas .
Pandas est spectaculaire pour traiter les fichiers csv, et le code suivant serait tout ce dont vous avez besoin pour lire un csv et enregistrer une colonne entière dans une variable:
donc si vous souhaitez enregistrer toutes les informations de votre colonne
Names
dans une variable, c'est tout ce que vous devez faire:C'est un excellent module et je vous suggère de l'examiner. Si pour une raison quelconque votre instruction d'impression était en
for
boucle et qu'elle n'imprimait toujours que la dernière colonne, ce qui ne devrait pas arriver, mais faites-moi savoir si mon hypothèse était erronée. Votre code publié contient beaucoup d'erreurs d'indentation, il était donc difficile de savoir ce qui était censé être où. J'espère que cela a été utile!la source
Avec un fichier comme
Sortira
Ou bien si vous souhaitez une indexation numérique des colonnes:
Pour changer le déliminateur, ajoutez
delimiter=" "
à l'instanciation appropriée, c'est-à-direreader = csv.reader(f,delimiter=" ")
la source
Utilisez des pandas :
Supprimer les colonnes inutiles au moment de l'analyse:
PS Je ne fais qu'agréger ce que les autres ont dit d'une manière simple. Les réponses réelles sont tirées d' ici et d' ici .
la source
Avec les pandas, vous pouvez utiliser
read_csv
avec leusecols
paramètre:Exemple:
la source
Vous pouvez utiliser
numpy.loadtext(filename)
. Par exemple, s'il s'agit de votre base de données.csv
:Et vous voulez la
Name
colonne:Plus facilement, vous pouvez utiliser
genfromtext
:la source
Contexte: Pour ce type de travail, vous devez utiliser l'incroyable bibliothèque petl python. Cela vous évitera beaucoup de travail et de frustration potentielle en faisant les choses «manuellement» avec le module csv standard. AFAIK, les seules personnes qui utilisent encore le module csv sont celles qui n'ont pas encore découvert de meilleurs outils pour travailler avec des données tabulaires (pandas, petl, etc.), ce qui est bien, mais si vous prévoyez de travailler avec beaucoup de données en votre carrière à partir de diverses sources étranges, apprendre quelque chose comme Petl est l'un des meilleurs investissements que vous puissiez faire. Pour commencer, cela ne devrait prendre que 30 minutes après avoir terminé l'installation de pip petl. La documentation est excellente.
Réponse: Disons que vous avez la première table dans un fichier csv (vous pouvez également charger directement à partir de la base de données en utilisant petl). Ensuite, vous le chargez simplement et procédez comme suit.
la source
Je pense qu'il existe un moyen plus simple
Donc ici
iloc[:, 0]
,:
signifie toutes les valeurs,0
signifie la position de la colonne. dans l'exemple ciID
- dessous sera sélectionnéla source
la source
pip install pandas
abordGrâce à la façon dont vous pouvez indexer et sous-définir un dataframe pandas, un moyen très simple d'extraire une seule colonne d'un fichier csv dans une variable est:
Quelques points à considérer:
L'extrait ci-dessus produira un pandas
Series
et nondataframe
. La suggestion d'ayhan avecusecols
sera également plus rapide si la vitesse est un problème. Tester les deux approches différentes à l'aide%timeit
d'un fichier csv de 2122 Ko donne des résultats22.8 ms
pour l'approche usecols et53 ms
pour l'approche suggérée.Et n'oubliez pas
import pandas as pd
la source
Si vous avez besoin de traiter les colonnes séparément, j'aime déstructurer les colonnes avec le
zip(*iterable)
motif (effectivement "décompresser"). Donc pour votre exemple:la source
Pour récupérer le nom de la colonne , au lieu d'utiliser readlines (), mieux vaut utiliser readline () pour éviter de boucler et de lire le fichier complet et de le stocker dans le tableau.
la source