Любая идея, как это можно прочитать как CSV? - питон - PullRequest
1 голос
/ 20 января 2011

CSV отформатирован следующим образом:

J = 123 [СКД] КЛЮЧ = тест [СКД] KEY2 = VAL123

, где [DLE] является управляющим символом «Побег канала передачи данных»


Есть идеи, как я могу использовать это со стандартной библиотекой CSV?

Нужно ли редактировать каждую строку, чтобы она была совместимой?

Редактировать: моя главная проблема - форматирование "KEY = VALUE"

Спасибо, ребята

Ответы [ 5 ]

5 голосов
/ 20 января 2011

Ваши данные на самом деле не в формате CSV, поэтому я бы не стал их использовать. Я бы написал генератор, который брал каждую строку, выполнял .split('\x10'), а затем делал .split('=', 1) на каждом фрагменте, а затем выдавал все это как диктовку.

def dgen(fin):
  for line in fin:
    yield dict(((k, v) for chunk in line.rstrip('\r\n').split('\x10')
        for (k, v) in chunk.split('=', 1)))
2 голосов
/ 20 января 2011

Вы можете разобрать его, просто переопределив разделитель (представьте, что снеговик - ваш DLE):

import csv
testdata='ID=123☃KEY=test☃KEY2=VAL123\nID=456☃KEY=test2☃KEY2=val456'
testdataiter=testdata.splitlines()
reader = csv.reader(testdataiter, delimiter='☃')
for row in reader:
    print (','.join(row))

вывод:

ID=123,KEY=test,KEY2=VAL123
ID=456,KEY=test2,KEY2=val456

Проверьте справку для модуля csv - любойиз параметров диалекта можно переопределить в конструкторе читателя.


Чтобы разобрать ваш KEY = VAL в dict, измените на:

...
for row in reader:
    rowdict = dict([x.split('=',1) for x in row])
    print rowdict

output:

{'KEY2': 'VAL123', 'ID': '123', 'KEY': 'test'}
{'KEY2': 'val456', 'ID': '456', 'KEY': 'test2'}
0 голосов
/ 20 января 2011
reader = csv.reader(open(datafile, "rb"), delimiter=chr(16))
data = (dict(tuple(i.split("=") for i in row)) for row in reader)

Даст вам генератор. Вы можете превратить его в список или кортеж.

data_list = list(data)

Какой будет список диктов.

[{'ID': '123', 'KEY': 'test', 'KEY2': 'VAL123'},
 {'ID': '456', 'KEY': 'test2', 'KEY2': 'val456'}]
0 голосов
/ 20 января 2011

Это то, что вы ищете?

>>> fields = ["ID","KEY","KEY2"]
>>> mydict = csv.DictReader(open("csv.txt","rbU"),delimiter=chr(16),fieldnames=field
s)
>>> mylist = [line for line in mydict]
>>> mylist
[{'KEY2': 'KEY2=VAL123', 'ID': 'ID=123', 'KEY': 'KEY=test'}]

Edit: лучший ответ, приведенный выше

0 голосов
/ 20 января 2011

В Python вы можете передать модулю csv символ формата ( csv module docs ):

>>> import csv
>>> spamReader = csv.reader(open('eggs.csv', 'rb'), delimiter=' ', quotechar='|')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...