写每个列表列表一行的CSV文件 - python

时间:2015-02-26 18:58:53

标签: python list csv beautifulsoup scikit-learn

使用Beautifulsoup(python 2.7)解析HTML文件,我有以下列表结构列表(我希望在一个CSV文件行中这样)。

[[['aaa', 'bbb', 'ccc'], ['ddd', 'eee', 'fff']], [['gg', 'h'],['ii', 'j']], [['nn', 'o', 'p'], ['qq', 'r', 's']], ['kkkk', 'llll', 'mmmm']]

我的代码是:

import csv
with open("profile_test.csv", "wb") as f:
    writer = csv.writer(f, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
    writer.writerows(full_profile)

import csv
with open('profile_test.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row

我得到的输出是不同行列表中的每个列表:

[['aaa', 'bbb', 'ccc'], ['ddd', 'eee', 'fff']]
[['gg', 'h'],['ii', 'j']]
[['nn', 'o', 'p'], ['qq', 'r', 's']]
['kkkk', 'llll', 'mmmm']

我使用了分隔符,但没有得到任何结果。

我是python和机器学习的新手,我很难适当地格式化我的数据。

感谢您的建议。

修改

只是为了进一步澄清,我希望在一行中获取数据的格式为:

[[['aaa', 'bbb', 'ccc'], ['ddd', 'eee', 'fff']], [['gg', 'h'],['ii', 'j']], [['nn', 'o', 'p'], ['qq', 'r', 's']], ['kkkk', 'llll', 'mmmm']]

3 个答案:

答案 0 :(得分:0)

如果我理解正确,你想要一条包含所有这些字母的单行,当字母改变时,逗号是什么?因为你有不同嵌套级别的嵌套列表,我认为你将不得不构建字符串来自己写,而不是使用csv包来寻求帮助。

例如,如果嵌套不会太深,

def big_string(_list):
    try:
        return ','.join(_list)
    except TypeError:
        return ','.join([big_string(thing) for thing in _list])


with open("profile_test.csv", "wb") as f:
    f.write(big_string(full_profile))

显示上述函数返回的内容,

>>> big_string([[['aaa', 'bbb', 'ccc'], ['ddd', 'eee', 'fff']], [['gg', 'h'],['ii', 'j']], [['nn', 'o', 'p'], ['qq', 'r', 's']], ['kkkk', 'llll', 'mmmm']])
'aaa,bbb,ccc,ddd,eee,fff,gg,h,ii,j,nn,o,p,qq,r,s,kkkk,llll,mmmm'

如果你正在寻找输出,如:

aaa
bbb
ccc
ddd

你可以这样做:

with open("profile_test.csv", "wb") as f:
    for entry in big_string(full_profile).split(','):
        f.write(entry + '\n')

答案 1 :(得分:0)

此?

result = []

with open('profile_test.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        result.append(row)

print(result)

答案 2 :(得分:0)

@Diego,

我仍然不完全确定你的目的是什么,但是如果你希望你的列表被压平并放在最高级别的列表结构中,你可以做这样的事情:

def rws():
    x = [[['aaa', 'bbb', 'ccc'], ['ddd', 'eee', 'fff']], [['gg', 'h'],['ii', 'j']], [['nn', 'o', 'p'], ['qq', 'r', 's']], ['kkkk', 'llll', 'mmmm']]
    sub_lists = []
    for y in x:
        if hasattr(y[0], '__iter__'): 
            sub_lists.append([i for s in y for i in s] )
        else:
            sub_lists.append(y)
    fin = []
    for l in sub_lists:
        fin.append('|'.join(l))
    print ','.join(fin)

它会输出:

aaa|bbb|ccc|ddd|eee|fff
gg|h|ii|j
nn|o|p|qq|r|s
kkkk|llll|mmmm

然后:

aaa|bbb|ccc|ddd|eee|fff,gg|h|ii|j,nn|o|p|qq|r|s,kkkk|llll|mmmm

正如所指出的,这不会处理深度递归,它只处理3或更少。此外,更重要的是,这可以用逗号分隔,您可以将每个一起添加到一个单元格中。这就是你要找的东西吗?

CSV中不能包含任何列表类型结构。这是一个明确的否定。