web-dev-qa-db-fra.com

Analyser une seule chaîne CSV?

Existe-t-il un moyen d'analyser une seule chaîne délimitée par des virgules sans utiliser quelque chose de fantaisiste comme un csv.reader (..)? Je peux utiliser la fonction split(',') mais cela ne fonctionne pas lorsqu'une valeur de colonne valide contient une virgule elle-même. La bibliothèque csv dispose de lecteurs pour analyser les fichiers CSV qui gèrent correctement le cas spécial susmentionné, mais je ne peux pas les utiliser car j'ai besoin d'analyser une seule chaîne. Cependant, si le CSV Python permet l'analyse d'une seule chaîne elle-même, c'est nouveau pour moi.

13
Ahmad

Examinez de plus près la documentation du module csv, qui dit:

reader(...)
    csv_reader = reader(iterable [, dialect='Excel']
                            [optional keyword args])
        for row in csv_reader:
            process(row)

    The "iterable" argument can be any object that returns a line
    of input for each iteration, such as a file object or a list.  The
    optional "dialect" parameter is discussed below.  The function
    also accepts optional keyword arguments which override settings
    provided by the dialect.

Donc, si vous avez une chaîne:

>>> s = '"this is", "a test", "of the csv", "parser"'

Et vous voulez "un objet qui retourne une ligne d'entrée pour chaque itération", vous pouvez simplement envelopper votre chaîne dans une liste:

>>> r = csv.reader([s])
>>> list(r)
[['this is', 'a test', 'of the csv parser']]

Et c'est ainsi que vous analysez une chaîne avec le module csv.

22
larsks

Vous pouvez toujours analyser une seule chaîne avec csv. Utilisez StringIO pour écrire une chaîne buffer (également connu sous le nom de fichiers mémoire ):

import csv
from StringIO import StringIO

s = "your string"
buff = StringIO(s)

reader = csv.reader(buff)
for line in reader:
    print(line)
15
alecxe
>>> import csv
>>> s = '"Yes, this line",can be, parsed as csv'
>>> list(csv.reader([s]))[0]
['Yes, this line', 'can be', ' parsed as csv']
>>>

Fondamentalement, juste @larsks répond ci-dessus, mais plus bref et démontre que cela fonctionne sur les valeurs csv qui ont des virgules entre guillemets.

Si vous me votez, votez aussi pour l'autre réponse. https://stackoverflow.com/a/35822856/1196339

7
nackjicholson