这是我关于StackOverflow的第一个问题,因此始终欢迎提出有关如何使问题更明确的建议。

我有一个点数据的CSV,其结构如下所示:

OBJECTID,CART_ID,SHAPE
1,ABC,"(1.2, -4.5)"
2,ABD,"(3.8, 9.1)"


在python 3.5中使用petl模块,我试图将SHAPE字符串转换为float对象的两个独立列。使用我从petl文档中了解的内容,我应该能够分三个步骤进行操作。


打开CSV:a = petl.fromcsv('file.csv')
将SHAPE从字符串转换为元组:b = petl.convert(a, 'SHAPE', tuple)
使用.unpack()将元组分为两列:c = petl.unpack(b, 'SHAPE', ['LAT', 'LON']


我相信这将导致一个CSV文件,如下所示:

OBJECTID,CART_ID,LAT,LON
1,ABC,1.2,-4.5
2,ABD,3.8,9.1


而是.convert()产生:

OBJECTID,CART_ID,SHAPE
1,ABC,('(', '1', '.', '2', ',', ' ', '-', '4', '.', '5', ')')


任何关于a).convert()正在做什么,或b)如何重组CSV的帮助将不胜感激。

谢谢。

完整代码:

import petl
a = petl.fromcsv('file.csv')
petl.look(a)
b = petl.convert(a, 'SHAPE', tuple)
petl.look(b)
c = petl.unpack(b, 'SHAPE', ['LAT', 'LON']
petl.look(c)

最佳答案

您没有像petl expects这样的复合表,您仍然有一个字符串。您需要将其传递给其他函数以对其进行解释:

>>> ast.literal_eval('(1, 2)')
(1, 2)


读者可以将ast.literal_eval()集成到petl中作为练习。

09-07 05:44