web-dev-qa-db-fra.com

Python analyse CSV en ignorant la virgule avec des guillemets doubles)

J'ai un fichier CSV avec des lignes comme celle-ci:

"AAA", "BBB", "Test, Test", "CCC"
"111", "222, 333", "XXX", "YYY, ZZZ" 

etc ...

Je ne veux pas analyser les virgules sous les guillemets doubles. c'est à dire. Mon résultat attendu devrait être

AAA
BBB
Test, Test
CCC

Mon code:

import csv
with open('values.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row

J'ai essayé d'utiliser le package csv sous python mais pas de chance. L'analyse analyse toutes les virgules.

S'il vous plaît faites le moi savoir si je manque quelque chose

20
Abhiram Sampath

Cela devrait faire:

lines = '''"AAA", "BBB", "Test, Test", "CCC"
           "111", "222, 333", "XXX", "YYY, ZZZ"'''.splitlines()
for l in  csv.reader(lines, quotechar='"', delimiter=',',
                     quoting=csv.QUOTE_ALL, skipinitialspace=True):
    print l
>>> ['AAA', 'BBB', 'Test, Test', 'CCC']
>>> ['111', '222, 333', 'XXX', 'YYY, ZZZ']
41
Michael

Vous avez des espaces avant les guillemets dans votre entrée. Définissez skipinitialspace sur True pour ignorer les espaces suivant un délimiteur:

Lorsque True, les espaces suivant immédiatement le délimiteur sont ignorés. La valeur par défaut est False.

>>> import csv
>>> lines = '''\
... "AAA", "BBB", "Test, Test", "CCC"
... "111", "222, 333", "XXX", "YYY, ZZZ" 
... '''
>>> reader = csv.reader(lines.splitlines())
>>> next(reader)
['AAA', ' "BBB"', ' "Test', ' Test"', ' "CCC"']
>>> reader = csv.reader(lines.splitlines(), skipinitialspace=True)
>>> next(reader)
['AAA', 'BBB', 'Test, Test', 'CCC']
12
Martijn Pieters