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