Como importar de um arquivo CSV já escrito como uma tupla aninhada?

votos
-2

Eu tenho um arquivo chamado 'test.csv'. Você pode ver as três primeiras linhas no anexado 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')

A primeira linha é o cabeçalho. Outras linhas têm os primeiros seis posições como strings, mas o sétimo posição como uma tupla de N cordas. A sétima posição tem parêntesis. Às vezes N == 0 de modo a sétima posição é vazio.

Quero importar este como uma tupla aninhada em meu programa, e chamá-lo de 'dados'. O arquivo .py do meu programa está no mesmo diretório que 'test.csv'. Eu quero:

len (dados) == número de linhas de test.csv

len (dados [x]) == 7 para os sete posições de qualquer x

len (dados [x] [6]) == número de cadeias de caracteres no âmbito da sétima posição da linha X

Qual é a maneira Python de fazer isso? obrigado

Publicado 20/09/2018 em 04:35
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Isso não é um formato CSV válido (se fosse, toda a tupla seria escapou e apresentada como uma única coluna do CSV) para que esta solução tem seus riscos. Assumindo que os parênteses estão simplesmente demarcando as colunas variáveis ​​que o fim da linha (e parens assumindo não são válidas nos outros campos), você poderia simplesmente tira-los fora. Sua válido para ter uma contagem de coluna variável em um CSV para que o analisador de python não terá um problema com eles.

Depois de ter analisado uma determinada linha em uma linha usando csv.reader, você pode simplesmente usar a lista de corte para selecionar as peças que você deseja manter.

Isso deve manter os primeiros 6 células e uma contagem dos remanescentes.

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)
Respondeu 20/09/2018 em 05:14
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more