2017-02-18 81 views
0

我想基於一系列數據塊來生成CSV文件:整型,浮點,字符串,字符串列表,浮動的列表:生成CSV

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_data和y_data列表可能有數千個元素。我想生成的文件如下所示:

|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庫來實現這一點。但是,由於要存儲的數據類型不同,編寫方法看起來不合適。我嘗試使用熊貓,但我添加不同長度的列時遇到問題。這個列最終會被我提供的一個值填充(在這種情況下,只有第一行應該是),或者其餘行由NaN填充。

您能否建議如何解決這個問題?

+0

您可以在空值的位置添加空格。你不能嗎? –

+0

以這種方式存儲數據並沒有真正的感覺。類型在你的列表中不同的事實不會成爲問題,你只需要它們具有相同的長度。 – debzsud

+0

這是數據文件的一個不尋常的設置,因爲通常大多數單元格都被填充,尤其是像* id *這樣的指示符字段。好奇這個文件將如何使用? * xdata *和* ydata *如何關聯?它們是否具有相同的長度,並且是*標籤*長度的倍數?熊貓可以填充或離開NaN。 – Parfait

回答

1

如果你有的東西是可迭代的,你可以使用itertools庫。

在python 2.7或zip_longest中有一個函數izip_longest在python 3.x中。這個函數需要迭代並返回一個生成器,它會一直持續到最長迭代中的最後一個值耗盡。你可以找到文檔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) 
]