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

时间:2018-09-20 04:35:19

标签: python csv import nested tuples

我有一个名为“ test.csv”的文件。您可以在所附的test.csv.jpg中看到前三行。

/\.(?: \.)+/

第一行是标题。其他行的前六个位置为字符串,但第七个位置为N个字符串的元组。第七位置带有括号。有时N == 0,所以第七个位置是空的。

我想将其作为嵌套元组导入到我的程序中,并将其称为“数据”。我程序的.py文件与“ test.csv”位于同一目录中。我想要:

len(data)== test.csv的行数

len(data [x])== 7,表示任意x的七个位置

len(data [x] [6])==第x行第七位置内的字符串数

执行此操作的pythonic方法是什么?谢谢

1 个答案:

答案 0 :(得分:0)

这不是有效的CSV格式(如果是,则整个元组将被转义并显示为CSV的单个列),因此此解决方案存在风险。假设parens只是将变量列标记为该行的末尾(并假定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)