3 回答
TA贡献2016条经验 获得超9个赞
如果我正确地破译了你的问题,这样的事情会做到:
import csv
from itertools import zip_longest
def grouper(n, iterable, sentinel=object()):
""" Collect data into fixed-length chunks or blocks. """
args = [iter(iterable)] * n
for t in zip_longest(*args, fillvalue=sentinel):
yield list(elem for elem in t if elem is not sentinel)
# Example usage.
data_list = [u'310', u'5291', u'1018', u'5.2', u'27', u'11', u'289', u'377', u'598',
u'3879', u'26', u'16', u'6.3', u'190', u'398', u'1412', u'6', u'3.5', u'73',
u'88', u'857', u'26', u'193', u'27.5', u'13.0', u'Own 27.6', u'2:21',
u'5.40', u'27.4']
sub_sub_header_list = [u'sub_header_0', u'sub_header_1', u'sub_header_2',
u'sub_header_3']
output_filename = 'grouped_data.csv'
group_size = len(sub_sub_header_list)
with open(output_filename, 'w', newline='') as csv_file:
csv_writer = csv.writer(csv_file)
for i, group in enumerate(grouper(group_size, data_list)):
row = [sub_sub_header_list[i%group_size]] + group
csv_writer.writerow(row)
print('File {!r} written.'.format(output_filename))
这是它根据示例数据创建的 csv 文件的内容:
sub_header_0,310,5291,1018,5.2
sub_header_1,27,11,289,377
sub_header_2,598,3879,26,16
sub_header_3,6.3,190,398,1412
sub_header_0,6,3.5,73,88
sub_header_1,857,26,193,27.5
sub_header_2,13.0,Own 27.6,2:21,5.40
sub_header_3,27.4
请注意,由于 中的项目数data_list不是 中数字的精确倍数sub_sub_header_list,因此最后一行没有前面的那么长。
TA贡献1807条经验 获得超9个赞
您还可以使用基本的 Python 函数来编写 csv 文件。
假设您的数据如下:
# elements converted to strings:
data_list = list(map(str, numpy.random.randint(1,100,20)))
sub_sub_header_list = ['A','B','C']
以下代码将生成所需的列表:
rowsize = len(sub_sub_header_list)
outlist=[]
# create header:
outlist.append(",".join(sub_sub_header_list))
# create rows:
for i in range(0,len(data_list)-rowsize,rowsize):
outlist.append(",".join(data_list[i:i+rowsize]))
# show format:
print("\n".join(outlist))
输出采用所需的格式:
A,B,C
16,72,38
79,4,37
93,19,77
87,54,87
26,4,17
73,59,56
并且可以通过以下方式生成 csv 文件:
with open("outfile.csv", "w") as f:
f.write("\n".join(outlist))
TA贡献1874条经验 获得超12个赞
请记住,CSV 以表格方式(如 excel)结构。首先是标题,然后是单独行上标题的每一列的数据。当您执行 a 时,writerow您必须为特定列提供正在写入的当前行的实际值。您基本上已经在每个列的 CSV 中编写了几个列表,w.writerow([sub_sub_header_list[0], data_list[0:29]])这基本上是这样的,这就是w.writerow([1, 2...], [3, 4,...])为什么您在 CSV 数据中输入了如下内容:
u'[1,2,..]', u'[3,4,...]'
它基本上将每个列表视为一个单独的单元格,并将其转换为字符串,以便将其存储在 CSV 中(这就是 CSV 的u''来源)。
你基本上必须在整个向量中保留一个引用索引,因为它是一个一维数据结构,一个接一个地附加了系列。
import csv
pf = open("out.csv", "w")
csv_writer = csv.DictWriter(pf, fieldnames=["A", "B", "C"])
csv_writer.writeheader()
LENGTH = 3 # number elements per column
data_list = [1, 1, 2, 2, 3, 3]
for i in range(LENGTH):
csv_writer.writerow({
'A': data_list[i],
'B': data_list[i+LENGTH],
'C': data_list[i+LENGTH*2],
})
pf.close()
输出将类似于:
A,B,C
1,2,3
1,2,3
添加回答
举报