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?
5
A
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
.
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) –
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
To prawdopodobnie nie zadziała, jeśli ciąg ma cytowane linie w obrębie wartości; Odpowiedź @ alecxe ma więcej sensu – swooby