web-dev-qa-db-fra.com

Comment lire un CSV sans la première colonne

J'essaie de lire un fichier CSV simple comme ci-dessous et de mettre son contenu dans un tableau 2D:

"","x","y","sim1","sim2","sim3","sim4","sim5","sim6","sim7","sim8","sim9","sim10","sim11","sim12"
"1",181180,333740,5.56588745117188,6.29487752914429,7.4835410118103,5.75873327255249,6.62183284759521,5.81478500366211,4.85671949386597,5.90418815612793,6.32611751556396,6.99649047851562,6.52076387405396,5.68944215774536
"2",181140,333700,6.36264753341675,6.5217604637146,6.16843748092651,5.55328798294067,7.00429201126099,6.43625402450562,6.17744159698486,6.72836923599243,6.38574266433716,6.81451606750488,6.68060827255249,6.14339065551758
"3",181180,333700,6.16541910171509,6.44704437255859,7.51744651794434,5.46270132064819,6.8890323638916,6.46842670440674,6.07698059082031,6.2140531539917,6.43774271011353,6.21923875808716,6.43355655670166,5.90692138671875

Pour ce faire, j'utilise ceci:

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1)

Mais j'ai toujours eu ce message:

"ValueError: could not convert string to float: "1"

Je pensais que le problème était avec la première colonne de chaque ligne. Alors, j'ai essayé de le lire sans la première colonne, mais je n'ai pas pu trouver comment.

Alors, comment pourrais-je ignorer la première colonne? Est-il possible de lire ce fichier avec la première colonne?

18
pceccon

Vous pouvez spécifier un convertisseur pour n'importe quelle colonne.

converters = {0: lambda s: float(s.strip('"')}
data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, converters=converters)

Ou, vous pouvez spécifier les colonnes à utiliser, quelque chose comme:

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, usecols=range(1,15))

http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html


Une façon de sauter la première colonne, sans connaître le nombre de colonnes, consiste à lire manuellement le nombre de colonnes à partir du fichier csv. C'est assez facile, bien que vous deviez peut-être modifier cela occasionnellement pour tenir compte des incohérences de formatage *.

with open("Data/sim.csv") as f:
    ncols = len(f.readline().split(','))

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, usecols=range(1,ncols+1))

* S'il y a des lignes vides en haut, vous devrez les ignorer. S'il peut y avoir des virgules dans les en-têtes de champ, vous devez compter les colonnes en utilisant plutôt la première ligne de données. Donc, si vous avez des problèmes spécifiques, je peux ajouter quelques détails pour rendre le code plus robuste.

26
jmilloy

Vous pouvez utiliser des pandas et le lire en tant qu’objet DataFrame. Si vous connaissez la colonne que vous ne voulez pas, ajoutez simplement un .drop à la ligne de chargement:

a = pandas.read_csv("Data/sim.csv",sep=",").drop(a.columns[0], axis=1)

La première ligne sera lue comme un en-tête, mais vous pouvez ajouter un skiprows = 1 dans le paramètre read_csv . Pandas DataFrames sont des tableaux numpy. 

6
Deninhos

les réponses de jmilloy et de Deninhos sont bonnes. Si OP veut spécifiquement lire dans un tableau NumPy (par opposition à pandas dataframe), une autre solution simpliste consiste à supprimer la colonne d'index après l'avoir lue. Cela fonctionne lorsque vous savez que la colonne d'index est toujours la première, mais le nombre d'entités ( colonnes) sont flexibles.

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1)
data = np.delete(data, 0, axis = 1)
0
oustella

Essayer de lire un fichier csv en utilisant la bibliothèque csv

import csv

def someFunc(fname):
    with open(fname) as f:
    reader = csv.reader(f)

    i = 0
    header = True
    for row in reader:
        if header:
            header = False
            continue

        out[i] = [row[j] for j in range(len(columns))]
        i += 1
return out

out aura le tableau 2D.

0
Karthik