2011-01-31 3 views
5

Есть ли способ проанализировать данные CSV на Python, когда данных нет в файле? Я храню данные CSV в моей базе данных, и я бы хотел разобрать его. Я ищу что-то аналогичное Ruby's CSV.parse. Я знаю, что Python имеет класс CSV, но все, что я видел в документах, похоже, имеет дело с файлами, а не с данными CSV в памяти.Анализ данных CSV из памяти в Python

(И это не вариант для анализа данных, прежде чем она попадает в базу данных.)

(И, пожалуйста, не говорите мне, не хранить данные в формате CSV в базу данных. Я знаю, что я что касается базы данных.)

+0

«Я храню данные CSV в моей базе данных, и я бы хотел разобрать его». Это неоднозначно. Вы сохраняете весь файл CSV в виде глоба или строки в базе данных? Вы имеете в виду, что вы храните все части информации в таблице в базе данных, где каждый столбец будет соответствовать полям CSV? – gotgenes

+0

Я храню весь файл как BLOB. –

+1

Какова структура BLOB? У вас есть возможность рассортировать данные? – jbcurtin

ответ

7

Не существует специального различия для файлов о модуле python csv. Вы можете использовать StringIO, чтобы обернуть ваши строки в виде файлов-подобных объектов.

+3

[cStringIO] (http://docs.python.org/library/stringio.html#module-cStringIO) является более подходящим в большинстве случаев. – gotgenes

1

Используйте модуль stringio, который позволяет одевать строки как файлы-подобные объекты. Таким образом, вы можете передать «файл» stringio в модуль CSV для синтаксического анализа (или любого другого анализатора, который вы можете использовать).

1

http://docs.python.org/library/csv.html

csv.reader(csvfile) 

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

Если у вас есть, например, содержание из БД в строке вы можете разобрать это нравится

import csv 

fromDB = "1,2,3\n4,5,6" 

reader = csv.reader(fromDB.split("\n")) 
for row in reader: 
    print("New row") 
    for col in row: 
    print(" ", col) 
+0

-1 Потому что ваш ответ - это простая RTFM-цитата из документов, без каких-либо дальнейших объяснений, почему и как это полезно. И он не отвечает на вопрос OP –

+0

@Martin Thurau добавил пример (пропуская часть БД, в соответствии с последним комментарием сам контент файла сохраняется в базе данных, а не отдельные строки) – Howard

+0

Это лучше. Хороший мальчик;) –

1

Вот почему вы должны использовать cStringIO.StringIO (io.StringIO в Python 3.x) вместо некоторого DIY ляп:

>>> import csv 
>>> from cStringIO import StringIO 
>>> fromDB = '"Column\nheading1",hdng2\r\n"data1\rfoo","data2\r\nfoo"\r\n' 
>>> sources = [StringIO(fromDB), fromDB.splitlines(True), 
...  fromDB.splitlines(), fromDB.split("\n")] 
>>> for i, source in enumerate(sources): 
...  print i, list(csv.reader(source)) 
... 
0 [['Column\nheading1', 'hdng2'], ['data1\rfoo', 'data2\r\nfoo']] # OK 
1 [['Column\nheading1', 'hdng2'], ['data1\rfoo', 'data2\r\nfoo']] # OK 
2 [['Columnheading1', 'hdng2'], ['data1foo', 'data2foo']]   # 3 errors 
3 [['Columnheading1', 'hdng2'], ['data1\rfoo', 'data2\rfoo'], []] # 3 errors 
>>> 

Использование guff.splitlines(True) является не рекомендуется, так как у него гораздо больше шансов, чем StringIO(guff), что тот, кто читает ваш код, не знает, что он делает.

Смежные вопросы