2016-01-20 75 views
2

我有两个列表看起来像这样:如何使用csv将列表编写为单独的元素?

list1 = ['filename1', 'filename2', 'filename3'] 
list2 = ['1', '2', ['3', '4', '5']] 

我如何写一个CSV文件,该文件最终会这样?

filename1,1 
filename2,2 
filename3,3,4,5 

我已经试过两件事情,但没有工作:

with open(outfname, 'wb') as fout: 
     csv_out = csv.writer(fout) 
     csv_out.writerows(izip(list1, list2)) 

这说明:

filename1,['1'] 
filename2,['2'] 
filename3,['3','4','5'] 

我尝试添加该writerows之前:

",".join(list2) 

但结果将显示:

filename1,1 
filename2,2 
filename3,"1,2,3" 

回答

2

@Satya必须使用一个好主意大熊猫,但你需要拼合列表2,你可以做到这一点与.apply()

>>> import pandas as pd 
>>> import sys 
>>> df = pd.DataFrame({'list1': list1, 'list2': list2}) 
>>> df = df.join(df.list2.apply(lambda x: pd.Series(x))) 
>>> df.drop('list2', axis=1).to_csv(sys.stdout, header=False, index=False) 
filename1,1,, 
filename2,2,, 
filename3,3,4,5 

这使空场那里有丢失数据。
另外,您可以编写自己的特殊拉链:

def my_zip(l1, l2): 
    for a, b in zip(l1, l2): 
     try: 
      yield [a]+b 
     except TypeError: 
      yield [a, b] 

>>> csv_out = csv.writer(sys.stdout) 
>>> csv_out.writerows(my_zip(list1, list2)) 
filename1,1 
filename2,2 
filename3,3,4,5 

这正是输出要求。

0

可以使用熊猫的数据帧,而不是形成所需的.csv文件

import pandas as pd 
list1 = ['filename1', 'filename2', 'filename3'] 
list2 = ['1', '2', ['3', '4', '5']] 
df = pd.DataFrame() 
df['a'] = list1 
df['b'] = list2 
df.to_csv('D:/sx.csv',index=False) ####you can give any desired path for csv 

扁平化的列表只是做

df['b']=[','.join(x) for x in df['b']] ####i have separated the list items by comma as of now, but you can give your own separator 

继续代码

df.to_csv('D:/sx.csv',index=False) 
    d = pd.read_csv('D:/sx.csv') 
    d 
     a  b 
0 filename1  1 
1 filename2  2 
2 filename3 3,4,5 

再次修改

d['a'] = d['a']+','+d['b'] 
    d 
    Out[39]: 
      a  b 
0  filename1,1  1 
1  filename2,2  2 
2 filename3,3,4,5 3,4,5 

然后删除列b

df = d.drop('b',axis=1) 
df 
Out[44]: 
      a 
0  filename1,1 
1  filename2,2 
2 filename3,3,4,5 
######column a shows the desired output... 

现在你可以通过形成的df.to_csv CSV( '路径+ FILE.CSV')

+0

这仍然不会消除'list [2]'。 – AChampion

+0

@ AChampion-修改了我的答案.. – Satya

+0

这仍然会在OP试图避免的字段周围放置分隔符,请参阅最后一个示例输出。 – AChampion

0

像这样。它需要一些临时列表,但可以完成工作。

import csv 

list1 = ['filename1', 'filename2', 'filename3'] 
list2 = ['1', '2', ['3', '4', '5']] 

with open('out.csv', 'w') as f: 
    r = csv.writer(f) 
    for name, num in zip(list1, list2): 
     r.writerow([name] + list(num)) 

out.csv看起来像

filename1,1 
filename2,2 
filename3,3,4,5 
0

你不需要对大熊猫。首先要获得你想要的数据结构,你可以使用zip。要保存为CSV,您可以使用标准的CSV模块。

import csv 
list1 = ['filename1', 'filename2', 'filename3'] 
list2 = ['1', '2', ['3', '4', '5']] 

zipped = zip(list1, list2) 
with open('some.csv', 'w', newline='') as f: 
    writer = csv.writer(f) 
    writer.writerows(zipped) 
+1

你试过这个吗?这不是OP正在寻找的东西,而且他们已经尝试了'[i] zip'。 – AChampion

0

请记住,一个字符串是一个项目列表。为什么你需要熊猫和所有的这个简单的任务?

list1 = ['filename1', 'filename2', 'filename3'] 
list2 = ['1', '2', ['3', '4', '5']] 
with open(outfname, 'w') as fout: 
    for item in zip(list1,list2): 
     fout.write(item[0]) 
     fout.write(',') 
     fout.write(','.join(item[1])) 
     fout.write('\n') 
+0

这是本地的。没有模块导入。超级平凡的人! – Spade

+0

适用于示例输入,但有点受限,任何非嵌套的2位数字(例如'['11','22',['3','4','5']')也会得到在数字之间放置一个'',''。 – AChampion

相关问题