2015-10-15 5 views
1

У меня есть вывод из http-запроса, который имеет тип строки, но данные похожи на csv. Поскольку тип вывода в моем заголовке запроса - csv ('Accept': "application/csv"). Как этот формат поддерживается источником. Но тип содержимого ответа - это строка. res=request.content type (res) `дает мне строку.чтение значения, разделенного запятыми, из строкового объекта в python

Вот пример вывода из объекта (разрешение):

QueryTime 
start,end 
144488,144490 

Data 

Data - AData 
id,G_id,name,type,time,sid,channel 
23,-1,"B1",type1,144488,11,CH23 
23,-1,"B1",type1,144488,11,CH23 
Data - BData 
id,G_id,time,se 
23,-1,144488,undefined 
23,-1,144488,undefined 

Если вы видите данные в виде CSV и есть несколько таблиц, как вы видите «ADATA» & «BData» I я не понимаю, какой подход взять, чтобы прочитать это. Я пробовал модуль csv, но не помогал. Я пробовал dict.csv для преобразования, но опять же. Не получать желаемый результат. Может быть, я делаю что-то неправильно, поскольку я новичок в python. Нужно прочитать каждую таблицу из выходного объекта.

with open('file.csv', 'wb') as csvfile: 
    spamwriter = csv.writer(csvfile, delimiter=',',quoting=csv.QUOTE_NONE) 
    spamwriter.writerow(rec) 

with open('file.csv') as csvfile: 
    reader = csv.DictReader(csvfile) 
    for row in reader: 
    print row 

Эксперты, пожалуйста, руководство :-)

+0

'writerow (Rec)' неверен ('rec' не один CSV ряд). Используйте ['with open ('file.csv', 'wb') в качестве файла: copyfileobj (r.raw, file)', чтобы сохранить файл, если вы передаете 'stream = True' на' запросы'] (http: // stackoverflow.com/a/32814347/4279). – jfs

ответ

0

Вы можете предварительно разобрать вывод, используя регулярное выражение для извлечения различных секций, а затем использовать StringIO разобрать каждый раздел в csv.reader следующим образом:

import csv 
import StringIO 
from collections import OrderedDict 

output = """ 
QueryTime 
start,end 
144488,144490 

Data 

Data - AData 
id,G_id,name,type,time,sid,channel 
23,-1,"B1",type1,144488,11,CH23 
23,-1,"B1",type1,144488,11,CH23 
Data - BData 
id,G_id,time,se 
23,-1,144488,undefined 
23,-1,144488,undefined""" 

sections = ['QueryTime', 'Data - AData', 'Data - BData', 'Data'] 
re_sections = '|'.join([re.escape(s) for s in sections]) 
tables = re.split(r'(' + re_sections + ')', output) 
tables = [t.strip() for t in tables[1:]] 

d_tables = OrderedDict() 

for section, table in zip(*[iter(tables)]*2): 
    if len(table): 
     csv_input = csv.reader(StringIO.StringIO(table)) 
     d_tables[section] = list(csv_input) 

for section, entries in d_tables.items(): 
    print section 
    print entries 
    print 

Давать вам следующий вывод:

QueryTime 
[['start', 'end'], ['144488', '144490']] 

Data - AData 
[['id', 'G_id', 'name', 'type', 'time', 'sid', 'channel'], ['23', '-1', 'B1', 'type1', '144488', '11', 'CH23'], ['23', '-1', 'B1', 'type1', '144488', '11', 'CH23']] 

Data - BData 
[['id', 'G_id', 'time', 'se'], ['23', '-1', '144488', 'undefined'], ['23', '-1', '144488', 'undefined']] 
0

я придумал эту функцию для анализа данных:

def parse_data(data): 
parsed = {} 
current_section = None 

for line in data.split('\n'): 
    line = line.strip() 
    if line: 
    if ',' in line: 
    current_section.append(line.split(',')) 
    else: 
    parsed[line] = [] 
    current_section = parsed[line] 
return parsed 

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

Запуск его на входе производит этот (переформатировать для удобства чтения):

{ 
'Data - AData': [ 
    ['id', 'G_id', 'name', 'type', 'time', 'sid', 'channel'], 
    ['23', '-1', '"B1"', 'type1', '144488', '11', 'CH23'], 
    ['23', '-1', '"B1"', 'type1', '144488', '11', 'CH23'] 
], 
'Data - BData': [ 
    ['id', 'G_id', 'time', 'se'], 
    ['23', '-1', '144488', 'undefined'], 
    ['23', '-1', '144488', 'undefined'] 
], 
'Data': [ 
], 
'QueryTime': [ 
    ['start', 'end'], 
    ['144488', '144490'] 
] 
} 
+0

Получение объекта AttributeError: объект 'module' не имеет атрибута 'split'. Я добавил модуль csv. import csv – D14

+0

Моя функция 'parse_data' принимает правильную строку (' data'). Он не нуждается в каких-либо специальных модулях. –