2016-03-06 14 views
5

Czy istnieje sposób, że można parsować pojedynczy ciąg rozdzielany przecinkami bez użycia niczego wymyślnego jak csv.reader (..)? Mogę użyć funkcji split(','), ale to nie działa, gdy poprawna wartość kolumny zawiera sam przecinek. Biblioteka csv ma ​​czytniki do parsowania plików CSV, które poprawnie obsługują wyżej wymieniony specjalny przypadek, ale nie mogę ich użyć, ponieważ muszę przeanalizować tylko jeden ciąg znaków. Jednak jeśli Python CSV pozwala na parsowanie samego ciągu znaków, to jest to dla mnie nowość.Parsować pojedynczy ciąg CSV?

Odpowiedz

11

Przyjrzyj w dokumentacji modułu csv, który mówi:

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. 

więc jeśli mieć ciąg:

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

I chcesz "obiekt, który zwraca linię Wejście dla każdego iteracji”, można po prostu owinąć swój ciąg w formie listy:

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

A to, w jaki sposób analizowania ciąg z modułem csv.

+0

Myślę, że byłoby bardziej elegancko używać 'iter (s)' zamiast ogólnego iteratora zamiast '[s]' (określając listę). Ale masz mój +1 – RafaelC

+0

To prawdopodobnie nie zadziała, jeśli ciąg ma cytowane linie w obrębie wartości; Odpowiedź @ alecxe ma więcej sensu – swooby

9

Nadal można przeanalizować pojedynczy ciąg znaków za pomocą csv. Użyj StringIO napisać ciąg buffer (znany również jako plików pamięci):

import csv 
from StringIO import StringIO 

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

reader = csv.reader(buff) 
for line in reader: 
    print(line) 
+0

Dla Pythona 3 użyj 'from io import StringIO' zobacz [tutaj] (https://docs.python.org/3/library/io.html#text-io) –

Powiązane problemy