首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用petl将字符串转换为元组

使用petl将字符串转换为元组
EN

Stack Overflow用户
提问于 2016-12-02 06:27:35
回答 3查看 261关注 0票数 1

这是我关于StackOverflow的第一个问题,所以关于如何使这个问题更清晰的建议总是值得欢迎的。

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

代码语言:javascript
复制
OBJECTID,CART_ID,SHAPE
1,ABC,"(1.2, -4.5)"
2,ABD,"(3.8, 9.1)"

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

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

我相信这会产生一个CSV文件,如下所示:

代码语言:javascript
复制
OBJECTID,CART_ID,LAT,LON
1,ABC,1.2,-4.5
2,ABD,3.8,9.1

相反,.convert()生成:

代码语言:javascript
复制
OBJECTID,CART_ID,SHAPE
1,ABC,('(', '1', '.', '2', ',', ' ', '-', '4', '.', '5', ')')

.convert()正在做什么,或者( b)如何重组CSV,我们将不胜感激。

谢谢。

完整代码:

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

发布于 2016-12-02 06:32:45

没有一个复合表作为petl 期待,您仍然有一个字符串。您需要将它传递给另一个函数,以解释它:

代码语言:javascript
复制
>>> ast.literal_eval('(1, 2)')
(1, 2)

ast.literal_eval()集成到petl中是留给读者的练习。

票数 1
EN

Stack Overflow用户

发布于 2016-12-02 08:10:39

正如Ignacio所提到的,您仍然需要拆分字符串数据。这可以使用strip()split()完成,也可以按照建议使用ast.literal_eval()来安全地评估最后一列的内容。

下面的示例使用此方法。它读取CSV文件,将最后一列拆分为其组成部分,并创建一个新的输出CSV文件:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
OBJECTID,CART_ID,LAT,LON
1,ABC,1.2,-4.5
2,ABD,3.8,9.1
票数 0
EN

Stack Overflow用户

发布于 2016-12-06 17:50:28

使用PETL,您可以只使用俘获和一个正则表达式:

代码语言:javascript
复制
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,所以您可以这样说:

代码语言:javascript
复制
b = petl.convert(a, 'SHAPE', eval)
c = petl.unpack(b, 'SHAPE', ['LAT', 'LON'])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40926116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档