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 Python CSV permet d'analyser une seule chaîne elle-même, c'est une nouvelle pour moi.

15
Ahmad 6 mars 2016 à 06:37

3 réponses

Meilleure réponse

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.

24
larsks 6 mars 2016 à 03:42

Vous pouvez toujours analyser une seule chaîne avec csv. Utilisez StringIO pour écrire un tampon de chaîne (également appelé 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)
18
spedy 11 sept. 2017 à 14:45
>>> 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 montre qu'il 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 12 août 2018 à 19:37