如何使用csv将列表编写为单独的元素?
问题描述:
我有两个列表看起来像这样:如何使用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"
答
@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
这正是输出要求。
答
可以使用熊猫的数据帧,而不是形成所需的.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')
答
像这样。它需要一些临时列表,但可以完成工作。
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
答
你不需要对大熊猫。首先要获得你想要的数据结构,你可以使用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
答
请记住,一个字符串是一个项目列表。为什么你需要熊猫和所有的这个简单的任务?
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')
这仍然不会消除'list [2]'。 – AChampion
@ AChampion-修改了我的答案.. – Satya
这仍然会在OP试图避免的字段周围放置分隔符,请参阅最后一个示例输出。 – AChampion