web-dev-qa-db-fra.com

Comment importer un fichier csv en utilisant python avec des en-têtes intacts, où la première colonne est un fichier non numérique

Ceci est une élaboration d’une question précédente, mais au fur et à mesure que je fouille plus profondément dans python, je ne sais plus trop comment python gère les fichiers csv.

J'ai un fichier csv et il doit rester tel (par exemple, je ne peux pas le convertir en fichier texte). C'est l'équivalent d'un tableau, d'une matrice ou d'un vecteur de 5 lignes sur 11 colonnes.

J'ai essayé de lire dans le CSV en utilisant diverses méthodes que j'ai trouvées ici et à d'autres endroits (par exemple, python.org) afin de préserver la relation entre les colonnes et les lignes, où la première ligne et la première colonne = des valeurs non numériques. Les autres sont des valeurs de flottant et contiennent un mélange de flottants positifs et négatifs.

Ce que je souhaite, c'est importer le fichier csv et le compiler dans python) de sorte que, si je faisais référence à un en-tête de colonne, celui-ci renverrait ses valeurs associées stockées dans les lignes. Par exemple:

>>> workers, constant, age
>>> workers
    w0
    w1
    w2
    w3
    constant
    7.334
    5.235
    3.225
    0
    age
    -1.406
    -4.936
    -1.478
    0

Et ainsi de suite...

Je recherche des techniques pour gérer ce type de structure de données. Je suis très nouveau en python.

51
myClone

Le module csv de Python traite les données par lignes, ce qui est la manière habituelle de visualiser ces données. Vous semblez vouloir une approche par colonne. Voici une façon de le faire.

En supposant que votre fichier s'appelle myclone.csv et contient

workers,constant,age
w0,7.334,-1.406
w1,5.235,-4.936
w2,3.2225,-1.478
w3,0,0

ce code devrait vous donner une ou deux idées:

>>> import csv
>>> f = open('myclone.csv', 'rb')
>>> reader = csv.reader(f)
>>> headers = next(reader, None)
>>> headers
['workers', 'constant', 'age']
>>> column = {}
>>> for h in headers:
...    column[h] = []
...
>>> column
{'workers': [], 'constant': [], 'age': []}
>>> for row in reader:
...   for h, v in Zip(headers, row):
...     column[h].append(v)
...
>>> column
{'workers': ['w0', 'w1', 'w2', 'w3'], 'constant': ['7.334', '5.235', '3.2225', '0'], 'age': ['-1.406', '-4.936', '-1.478', '0']}
>>> column['workers']
['w0', 'w1', 'w2', 'w3']
>>> column['constant']
['7.334', '5.235', '3.2225', '0']
>>> column['age']
['-1.406', '-4.936', '-1.478', '0']
>>>

Pour obtenir vos valeurs numériques dans les flottants, ajoutez ceci

converters = [str.strip] + [float] * (len(headers) - 1)

à l'avant, et le faire

for h, v, conv in Zip(headers, row, converters):
  column[h].append(conv(v))

pour chaque ligne au lieu des deux lignes similaires ci-dessus.

84
John Machin

Pour Python 2

import csv
with open( <path-to-file>, "rb" ) as theFile:
    reader = csv.DictReader( theFile )
    for line in reader:
        # line is { 'workers': 'w0', 'constant': 7.334, 'age': -1.406, ... }
        # e.g. print( line[ 'workers' ] ) yields 'w0'

Python a un puissant gestionnaire CSV intégré. En fait, la plupart des éléments sont déjà intégrés à la bibliothèque standard.

Pour Python

Supprimez l'argument rb et utilisez r ou ne transmettez pas l'argument (default read mode).

with open( <path-to-file>, 'r' ) as theFile:
    reader = csv.DictReader(theFile)
    for line in reader:
        # line is { 'workers': 'w0', 'constant': 7.334, 'age': -1.406, ... }
        # e.g. print( line[ 'workers' ] ) yields 'w0'
        print(line)
114
Katriel

Vous pouvez utiliser la bibliothèque pandas et référencer les lignes et les colonnes comme ceci:

import pandas as pd

input = pd.read_csv("path_to_file");

#for accessing ith row:
input.iloc[i]

#for accessing column named X
input.X

#for accessing ith row and column named X
input.iloc[i].X
10
Ankur