这是我关于StackOverflow的第一个问题,所以关于如何使这个问题更清晰的建议总是值得欢迎的。
我有一个点数据的CSV结构如下所示:
OBJECTID,CART_ID,SHAPE
1,ABC,"(1.2, -4.5)"
2,ABD,"(3.8, 9.1)"使用python 3.5中的petl模块,我试图将SHAPE字符串转换为两个独立的float对象列。使用我从花瓣文档中了解到的内容,我应该能够分三个步骤完成它。
a = petl.fromcsv('file.csv')b = petl.convert(a, 'SHAPE', tuple)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', ')').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)发布于 2016-12-02 06:32:45
没有一个复合表作为petl 期待,您仍然有一个字符串。您需要将它传递给另一个函数,以解释它:
>>> ast.literal_eval('(1, 2)')
(1, 2)将ast.literal_eval()集成到petl中是留给读者的练习。
发布于 2016-12-02 08:10:39
正如Ignacio所提到的,您仍然需要拆分字符串数据。这可以使用strip()和split()完成,也可以按照建议使用ast.literal_eval()来安全地评估最后一列的内容。
下面的示例使用此方法。它读取CSV文件,将最后一列拆分为其组成部分,并创建一个新的输出CSV文件:
import csv
import ast
with open('input.csv', newline='') as f_input, open('output.csv', 'w', newline='') as f_output:
csv_input = csv.reader(f_input)
csv_output = csv.writer(f_output)
csv_output.writerow(next(csv_input)[:2] + ['LAT', 'LON'])
for row in csv_input:
csv_output.writerow(row[:2] + list(ast.literal_eval(row[2])))给您一个output.csv,如下所示:
OBJECTID,CART_ID,LAT,LON
1,ABC,1.2,-4.5
2,ABD,3.8,9.1发布于 2016-12-06 17:50:28
使用PETL,您可以只使用俘获和一个正则表达式:
b = petl.capture(a, 'SHAPE', r'\(\s*([-0-9.]+)\s*,\s*([-0-9.]+)\s*\)', ['LAT', 'LON'])
c = petl.convert(b, ['LAT', 'LON'], float)这将检测数字,并创建两个名为LAT和LON的新列,但它们将是字符串,因此您可能需要在之后使用转换来浮动。
一种稍微“邪恶”的方法是认识到,对于带有两个浮点数的元组来说,表达式是有效的python,所以您可以这样说:
b = petl.convert(a, 'SHAPE', eval)
c = petl.unpack(b, 'SHAPE', ['LAT', 'LON'])https://stackoverflow.com/questions/40926116
复制相似问题