Pytanie Parsować pojedynczy ciąg CSV?


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ć split(',') Funkcja ta 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ść.


9
2018-03-06 03:37


pochodzenie




Odpowiedzi:


Przyjrzyj się bliżej dokumentacji dla csv moduł, 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 masz ciąg:

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

I chcesz "obiekt, który zwraca linię danych wejściowych dla każdego iteracja ", możesz po prostu zawinąć swój ciąg na liście:

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

I tak analizujesz ciąg znaków za pomocą csv moduł.


13
2018-03-06 03:42



Sądzę, że byłoby to bardziej eleganckie w użyciu iter(s) zamiast ogólnego iteratora zamiast [s] (określając listę). Ale masz moje +1 - RafaelC
Prawdopodobnie to nie zadziała, jeśli ciąg zawiera cytowane linie w obrębie wartości; Odpowiedź @ alecxe ma więcej sensu - swooby
list(csv.reader(['"this is", "a test", "of the csv", "parser"']))[0] Bum! - nackjicholson


Nadal możesz parsować pojedynczy ciąg przy pomocy csv. Użyj StringIO, aby napisać ciąg bufor (znany również jako pliki pamięci):

import csv
from StringIO import StringIO

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

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

13
2018-03-06 03:41



Do użytku w Pythonie 3 from io import StringIO widzieć tutaj - Christian Groleau
Ale uważaj na ciągi spoza zestawu ASCII! "Jeśli używane są [ciągi Unicode i 8-bitowe], 8-bitowe łańcuchy, które nie mogą być interpretowane jako 7-bitowe ASCII (używające ósmego bitu) spowodują wzrost UnicodeError po wywołaniu funkcji getvalue ()." - Elias Strehle


>>> import csv
>>> s = '"Yes, this line",can be, parsed as csv'
>>> list(csv.reader([s]))[0]
['Yes, this line', 'can be', ' parsed as csv']
>>>

Zasadniczo po prostu odpowiedź @larsks powyżej, ale krótszy i pokazujący, że działa na wartościach csv, które mają przecinki w cudzysłowach.

Jeśli mnie awansujesz, przeżyj też drugą odpowiedź. https://stackoverflow.com/a/35822856/1196339


0
2017-08-12 19:32