基于不同类型的数据生成csv

2024-10-02 22:26:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试根据一系列数据生成csv文件:int、float、string、string列表、float列表:

temp = 15.3
id = '98'
tags = ['b34s', '7eo9', '7w49']
hum = 1.89
x_data = [32,87,87,742,342,7.2,992,...]
y_data = [65.3,89.7,458.8,589,529,8789,489,...]

x\u数据和y\u数据列表可能有数千个元素。我希望生成的文件如下所示:

|temp|id|tags|hum.|x_data|y_data|
|15.3|98|b34s|1.89|    32|  65.3|
|    |  |7eo9|    |    87|  89.7|
|    |  |7w49|    |    87| 458.8|
|    |  |    |    |   742|   589|
|    |  |    |    |   342|   529|
|    |  |    |    |   7.2|  8789|
|    |  |    |    |   992|   489|
|    |  |    |    |   ...|   ...|

如您所见,csv由列组成。有些列只包含一段数据,有些则包含更多。我试图通过使用csv库来实现这一点。但是,由于要存储的数据类型不同,writerow方法似乎不合适。我试过使用pandas,但是在添加不同长度的列时遇到了问题。要么该列最终由我提供的一个值填充(在本例中,只有第一行应该是),要么其余的行由NaN填充

你能建议如何解决那个问题吗


Tags: 文件csv数据id元素列表datastring
1条回答
网友
1楼 · 发布于 2024-10-02 22:26:48

如果您拥有的一切都是可编辑的,那么您可以使用itertools库

Python2.7中有一个函数izip\u longest,Python3.x中有一个函数zip\u longest。此函数接受iterables并返回一个生成器,该生成器将一直运行,直到最长iterables中的最后一个值用完为止。您可以找到文档here for itertools in 2.7

这个函数有一个fillvalue参数,让您选择要用哪个值填充空的值

可以将返回的生成器直接传递给csv.writerows函数

>>> # assuming your values are iterables
>>> temp = [15.3]
>>> id = ['98']
>>> tags = ['b34s', '7eo9', '7w49']
>>> hum = [1.89]
>>> x_data = [32,87,87,742,342,7.2,992]
>>> y_data = [65.3,89.7,458.8,589,529,8789,489]

>>> from itertools import izip_longest
>>> [zipped for zipped in izip_longest(temp, id, tags, hum, x_data, y_data)]
[(15.3, '98', 'b34s', 1.89, 32, 65.3),
 (None, None, '7eo9', None, 87, 89.7),
 (None, None, '7w49', None, 87, 458.8),
 (None, None, None, None, 742, 589),
 (None, None, None, None, 342, 529),
 (None, None, None, None, 7.2, 8789),
 (None, None, None, None, 992, 489)
]
>>> [zipped for zipped in izip_longest(temp, id, tags, hum, x_data, y_data, fillvalue='')]
[(15.3, '98', 'b34s', 1.89, 32, 65.3),
 ('', '', '7eo9', '', 87, 89.7),
 ('', '', '7w49', '', 87, 458.8),
 ('', '', '', '', 742, 589),
 ('', '', '', '', 342, 529),
 ('', '', '', '', 7.2, 8789),
 ('', '', '', '', 992, 489)
]

相关问题 更多 >