Строка csv Python в массив

Кто-нибудь знает простую библиотеку или функцию для анализа строки в кодировке csv и превращения ее в массив или словарь?

Я не думаю, что мне нужен встроенный модуль csv, потому что во всех примерах я Мы видели, что используются пути к файлам, а не строки.


person Drew LeSueur    schedule 22.07.2010    source источник


Ответы (9)


Вы можете преобразовать строку в объект файла, используя io.StringIO, а затем передать это в модуль csv:

from io import StringIO
import csv

scsv = """text,with,Polish,non-Latin,letters
1,2,3,4,5,6
a,b,c,d,e,f
gęś,zółty,wąż,idzie,wąską,dróżką,
"""

f = StringIO(scsv)
reader = csv.reader(f, delimiter=',')
for row in reader:
    print('\t'.join(row))

более простая версия с split() на новой строке:

reader = csv.reader(scsv.split('\n'), delimiter=',')
for row in reader:
    print('\t'.join(row))

Или вы можете просто split() эту строку разбить на строки, используя \n в качестве разделителя, а затем split() каждую строку в значения, но при этом вы должны знать о цитировании, поэтому использование модуля csv является предпочтительным.

В Python 2 вам нужно импортировать StringIO как

from StringIO import StringIO

вместо.

person Michał Niklas    schedule 22.07.2010
comment
метод разделения не работал бы, если бы его CSV-файл содержал строки, содержащие запятые - person Carson Myers; 22.07.2010
comment
или строки в кавычках как значения (с запятыми или без них) - person adamk; 22.07.2010
comment
Python 3 теперь использует io.StringIO. (Надеюсь сэкономить время пользователям Python 3). так что импортируйте io и io.StringIO. - person JStrahl; 20.07.2012
comment
Вместо .split('\n') можно использовать .splitlines(). - person Denilson Sá Maia; 25.09.2014
comment
Я считаю, что это работает только для строк csv только ascii - person leo; 15.07.2017
comment
Нет, очень хорошо работает с польскими буквами с огонками :-) - person Michał Niklas; 18.07.2017
comment
Да, остерегайтесь правил цитирования / экранирования при использовании простых split()s, особенно, если две двойные кавычки - это всего лишь одна. ср. tools.ietf.org/html/rfc4180 - person flow2k; 28.01.2019

Просто - модуль csv работает и со списками:

>>> a=["1,2,3","4,5,6"]  # or a = "1,2,3\n4,5,6".split('\n')
>>> import csv
>>> x = csv.reader(a)
>>> list(x)
[['1', '2', '3'], ['4', '5', '6']]
person adamk    schedule 22.07.2010
comment
Полезно знать, но имейте в виду, что .split('\n') будет делать странные вещи, если ваши поля содержат символы новой строки. - person Inaimathi; 15.04.2013
comment
@Inaimathi, если это csv, символы новой строки внутри должны быть экранированы. - person John La Rooy; 15.12.2015
comment
Символы новой строки не нужно экранировать, если поле заключено в кавычки. - person Jonathan Stray; 31.01.2017
comment
Эта функция плохо документирована. Спасибо. - person cowlinator; 09.04.2019

Официальный документ для csv.reader() https://docs.python.org/2/library/csv.html очень полезен, в нем говорится

подходят как файловые объекты, так и объекты списков

import csv

text = """1,2,3
a,b,c
d,e,f"""

lines = text.splitlines()
reader = csv.reader(lines, delimiter=',')
for row in reader:
    print('\t'.join(row))
person soulmachine    schedule 23.02.2017

>>> a = "1,2"
>>> a
'1,2'
>>> b = a.split(",")
>>> b
['1', '2']

Чтобы проанализировать файл CSV:

f = open(file.csv, "r")
lines = f.read().split("\n") # "\r\n" if needed

for line in lines:
    if line != "": # add other needed checks to skip titles
        cols = line.split(",")
        print cols
person nvd    schedule 13.04.2014
comment
«Лучше простое, чем сложное!» - person Abdelouahab; 06.12.2014
comment
-1 Проблема с этим решением заключается в том, что оно не учитывает экранирование строки, т.е. 3, "4,5,6, 6 следует рассматривать как три поля вместо пяти. - person Zz'Rot; 09.02.2016
comment
Просто, но работает только в некоторых конкретных случаях, это не общий код синтаксического анализа CSV. - person Christophe Roussy; 03.05.2016

Как уже отмечали другие, Python включает модуль для чтения и записи файлов CSV. Он работает очень хорошо, пока вводимые символы остаются в пределах ASCII. Если вы хотите обработать другие кодировки, потребуется дополнительная работа.

В документации Python для модуля csv реализовано расширение из csv.reader, который использует тот же интерфейс, но может обрабатывать другие кодировки и возвращает строки Unicode. Просто скопируйте и вставьте код из документации. После этого вы можете обработать CSV-файл следующим образом:

with open("some.csv", "rb") as csvFile: 
    for row in UnicodeReader(csvFile, encoding="iso-8859-15"):
        print row
person roskakori    schedule 22.07.2010
comment
Убедитесь, что файл Unicode не имеет спецификации (маркер порядка байтов) - person Pierre; 13.10.2014
comment
Относительно спецификации: Python должен обнаруживать и пропускать официальные спецификации в UTF-32, UTF-16 и т. Д. Чтобы пропустить неофициальную спецификацию Microsoft для UTF-8, используйте 'utf-8-sig' в качестве кодека вместо 'utf-8'. - person roskakori; 07.12.2014

Согласно документации:

И хотя модуль напрямую не поддерживает синтаксический анализ строк, это легко сделать:

import csv
for row in csv.reader(['one,two,three']):
    print row

Просто превратите вашу строку в список из одного элемента.

Импорт StringIO кажется мне немного чрезмерным, когда этот пример явно присутствует в документации.

person roundar    schedule 22.03.2017

https://docs.python.org/2/library/csv.html?highlight=csv#csv.reader

csvfile может быть любым объектом, который поддерживает протокол итератора и возвращает строку каждый раз, когда вызывается его метод next ().

Таким образом, StringIO.StringIO(), str.splitlines() или даже генератор - все хорошо.

person ivan_pozdeev    schedule 13.04.2014

Вот альтернативное решение:

>>> import pyexcel as pe
>>> text="""1,2,3
... a,b,c
... d,e,f"""
>>> s = pe.load_from_memory('csv', text)
>>> s
Sheet Name: csv
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| a | b | c |
+---+---+---+
| d | e | f |
+---+---+---+
>>> s.to_array()
[[u'1', u'2', u'3'], [u'a', u'b', u'c'], [u'd', u'e', u'f']]

Вот документация.

person chfw    schedule 03.12.2014

Используйте это, чтобы загрузить csv в список

import csv

csvfile = open(myfile, 'r')
reader = csv.reader(csvfile, delimiter='\t')
my_list = list(reader)
print my_list
>>>[['1st_line', '0'],
    ['2nd_line', '0']]
person JimS    schedule 12.10.2015