如何从已编写为嵌套元组的csv文件导入?

问题描述 投票:-2回答:1

我有一个名为'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方法是什么?谢谢

python csv import nested tuples
1个回答
0
投票

这不是有效的CSV格式(如果是,整个元组将被转义并呈现为CSV的单个列),因此该解决方案存在风险。假设parens只是将行的末尾的变量列标记为demark(并且假设parens在其他字段中无效),则可以简单地将它们删除。它在CSV中具有变量列计数是有效的,因此python解析器不会出现问题。

使用csv.reader将给定行解析为行后,只需使用列表切片选择要保留的部分即可。

这应该保留前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)
© www.soinside.com 2019 - 2024. All rights reserved.