La lecture de fichiers CSV dans numpy où le séparateur est “,”
J'ai un fichier CSV avec un format qui ressemble à ceci:
"FieldName1", "FieldName2", "FieldName3", "FieldName4"
"04/13/2010 14:45:07.008", "7.59484916392", "10", "6.552373"
"04/13/2010 14:45:22.010", "6.55478493312", "9", "3.5378543"
...
Remarque qu'il y a des doubles guillemets au début et à la fin de chaque ligne dans le fichier CSV, et la ","
chaîne est utilisée pour délimiter les champs à l'intérieur de chaque ligne. Le nombre de champs dans le fichier CSV peut varier d'un dossier à l'autre.
Lorsque je tente de lire cela dans numpy par:
import numpy as np
data = np.genfromtxt(csvfile, dtype=None, delimiter=',', names=True)
toutes les données est lu en tant que chaîne de valeurs, entouré par des guillemets doubles. Pas déraisonnable, mais pas tellement pour moi que je puis avoir à revenir en arrière et de convertir chaque colonne type correct
Lorsque j'utilise delimiter='","'
au lieu de cela, tout fonctionne comme je le voudrais, sauf pour la 1ère et la dernière champs. Comme le début de la ligne et les caractères de fin de ligne sont un guillemet simple, ce n'est pas considéré comme valable délimiteur pour le 1er et le dernier champs, de sorte qu'ils se lire comme par exemple "04/13/2010 14:45:07.008
et 6.552373"
- notez l'attaque et de fuite, les guillemets doubles, respectivement. En raison de ces caractères redondants, numpy suppose le 1er et le dernier champs sont les deux types de chaînes; je ne veux pas que ce soit le cas
Est-il un moyen de les instruire de la numpy à lire dans des fichiers formatés de cette façon que je le souhaiterais, sans avoir à revenir en arrière et de "fixer" la structure du tableau numpy après la première lecture?
OriginalL'auteur monch1962 | 2010-04-19
Vous devez vous connecter pour publier un commentaire.
Le problème de base est que NumPy ne pas comprendre le concept de décapage des citations (alors que la
csv
module). Quand vous ditesdelimiter='","'
, vous dites NumPy que le délimiteur de colonne est littéralement une cité virgule, c'est à dire les citations sont autour de la virgule, et non la valeur, de sorte que les guillemets supplémentaires que vous obtenez sur les première et dernière colonnes sont attendus.À la recherche à la fonction docs, je pense que vous aurez besoin de définir les
converters
paramètre de bande de citations pour vous (par défaut):Ou d'abandonner
np.genfromtxt()
et laissezcsv.csvreader
vous donner le contenu du fichier une ligne à la fois, comme des listes de chaînes de caractères, alors que vous venez de faire une itération sur les éléments et de construire la matrice:EDIT: d'Accord, donc il semble que votre fichier n'est pas tous les flotteurs. Dans ce cas, vous pouvez définir
convs
dans l'genfromtxt
cas, ou de créer un vecteur de fonctions de conversion de lacsv.csvreader
cas:EDIT 2: Ok, la variable nombre de colonnes... Votre source de données, il veut juste rendre la vie difficile. Heureusement, il suffit d'utiliser
magic
...... où
magic()
est juste un nom, je suis au sommet de ma tête pour une fonction. (Psyché!)Au pire, il pourrait être quelque chose comme:
Peut-être NumPy a une fonction qui prend une chaîne de caractères et renvoie un élément unique avec le type de droit.
numpy.fromstring()
regarde de plus près, mais il pourrait interpréter l'espace dans votre horodateurs comme un séparateur de colonnes.P. S. Un inconvénient avec
csvreader
je vois c'est qu'il ne jetez pas de commentaires; réelcsv
les fichiers n'ont pas de commentaires.str.replace('"', '')
méthode doit effectuer sensiblement plus rapide que l'expression régulière si le fichier d'entrée est grand (plusieurs mo ou go), et sera correcte si vous pouvez supposer que le"
personnage n'apparaît pas dans le milieu d'un champ, seules les extrémités.Merci Mike et gotgenes, mais je ai aussi mentionné que le fichier CSV contient un nombre variable de colonnes. Je pourrais probablement utiliser l'approche que vous avez décrit par l'ajout d'une étape initiale de lire dans le 1er enregistrement du fichier pour déterminer le nombre de colonnes, puis en utilisant comme entrée pour les étapes ultérieures, mais il semble assez maladroit. Est-il un meilleur moyen?
Minuscule remarque: vous n'avez pas besoin d'utiliser
re.compile()
parce que, tout en utilisantre.match()
directement cache le compilé expression régulière de toute façon.Fonctionne comme un charme - merci les gars
DeSimone. Oui, en effet. J'espère que cette aide. Voir la note est docs.python.org/library/re.html#re.compile
OriginalL'auteur Mike DeSimone