Как импортировать из файла CSV, уже записанного как вложенный кортеж? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть файл с именем 'test.csv'.Вы можете увидеть первые три строки в прикрепленном test.csv.jpg .

'ID','NO_QUESTION','NO_RESPONSE','VALUE','MEMORY','AVAILABILITY','CLICK_EFFET'
'34','01','01','1','1','0',('q01a01vato1dito0','q01a02vato0dito1')
'35','01','02','0','0','1',('q01a01vato0dito1','q01a02vato1dito0')

Первая строка - это заголовок.Другие строки имеют первые шесть позиций в виде строк, но седьмую позицию в виде кортежа из N строк.Седьмая позиция имеет круглые скобки.Иногда N == 0, поэтому седьмая позиция пуста.

Я хочу импортировать это как вложенный кортеж в мою программу и назвать его «данными».Файл .py моей программы находится в том же каталоге, что и «test.csv».Я хочу:

len (data) == количество строк test.csv

len (data [x]) == 7 для семи позиций любого x

len (data [x] [6]) == количество строк в седьмой позиции строки x

Что такое Pythonic способ сделать это?Спасибо

1 Ответ

0 голосов
/ 20 сентября 2018

Это недопустимый формат CSV (если бы он был, весь кортеж был бы экранирован и представлен как один столбец CSV), поэтому это решение имеет свои риски.Предполагая, что парены просто размечают переменные столбцы, что конец строки (и предполагая, что парены недопустимы в других полях), вы можете просто удалить их.Допустимо иметь переменное количество столбцов в CSV, чтобы у парсера python не возникало с ними проблем.

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

Это должно сохранить первые 6 ячеек и количество остатков.

import csv
import re

data = []
strip_paren = re.compile(r'\(\)')

with open('test.csv', newline='') as fp:
    # skip header
    next(fp)
    # strip parens so lines will parse as csv
    for row in csv.reader((re.sub(r'\(\)', '', line) for line in fp),
        quotechar="'"):
        # split row for nested data info
        data.append(row[:6] + [len(row[6:])])

print(data)
...