论坛客户端

登录     注册     忘记密码

 色影无忌 > 文字论坛 > 电脑手机论坛 收藏(1)   打印预览 
go
 主题:Python如何快速的将一段文本变成数据
关键词: 发帖用户名:
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
有上亿段文本数据,长短不一,都是这样的格式
{dd=[123,0,25],tag="ff—gg98",formtt=97,type=qwerty:fgfdfh,data={a=2,c=3.5,gg=[4.7,9.8,0.2,-1.3e-10],hh=True,jj=[1,0,8.9,5e-10]}}

里面的[ ],{ }数量不等,里面的数据量也不一样,还有,none,false,true之类的逻辑量。
如何快速的转成Python的字典数据? 本帖最后由 fukewu 于 2018-8-9 18:37 编辑
微信扫一扫分享
2018-08-09 18:32
 浏览:773  回帖:29   
回复
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
fukewu 发表于 2018-8-14 16:07
@老鼠不相往来

再请教个问题,只有python2.7.5(不能升级),生成的dictionary文件太大,处理到一半数据不到时,报memory error了,如何规避这个error。

关于以前的那个数据,最后还是用另一方法搞的,直接从数据头开始读,遇到“{“ 或 “[“ 就保存个空的[],后面的数据往里填,遇到“}“就将用zip把[]转成dict,如果遇到“]“,就不动他。
明天试着切片,然后用pickle保存成一个一个100M的小临时文件看能不能解决这个问题。
2018-08-14 17:50
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
@老鼠不相往来

再请教个问题,只有python2.7.5(不能升级),生成的dictionary文件太大,处理到一半数据不到时,报memory error了,如何规避这个error。

关于以前的那个数据,最后还是用另一方法搞的,直接从数据头开始读,遇到“{“ 或 “[“ 就保存个空的[],后面的数据往里填,遇到“}“就将用zip把[]转成dict,如果遇到“]“,就不动他。
2018-08-14 16:07
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
fukewu 发表于 2018-8-10 18:02
非常好。
最后的结果顺序有点乱外,近乎完美。但这个是字典数据的特性。
等下用ordereddict试一下,这个应该可以不打乱次序。
2018-08-10 19:04
zhangkeming
泡菜 邮箱已验证 手机已验证
泡网分: 2.402
主题: 5
帖子: 6923
注册: 2012年06月
正则表达式就行,搜下教程
2018-08-10 19:00
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
老鼠不相往来 发表于 2018-8-10 17:27
强转json标准格式算法,几行就能解决(忽略类型,全部string)

非常好。
最后的结果顺序有点乱外,近乎完美。但这个是字典数据的特性。 本帖最后由 fukewu 于 2018-8-10 18:07 编辑
2018-08-10 18:02
duoduobear
Canon论坛版主手机已验证
泡网分: 81.469
主题: 938
帖子: 17896
注册: 2003年10月

内容贡献勋章

学习了
2018-08-10 17:50
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
老鼠不相往来 发表于 2018-8-10 17:27
强转json标准格式算法,几行就能解决(忽略类型,全部string)

这个应该可以对付所有的数据了,高手
2018-08-10 17:37
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
老鼠不相往来 发表于 2018-8-10 17:23
你的新例子跟之前的变化是 = 变成了(空格)=(空格)

加一句就行了

#正则分段
        str = str.replace(" = ", "=");

执行正常

[{'sequence': [551250, 44157, 4351]}, {'tag': 'VR-ZZ08'}, {'format': 83009}, {'type': 'vertical:focus_parameters'}, {'data': [{'align_mark_type': 'TRANSIMISSION'}, {'top_plate_name': 'TOP_DIFRACTION_PLATE'}, {'t_y': 0.094294}, {'v_plane': [{'Z': 7.26429e-07}, {'Rx': 0.0}, {'Ry': 6.3947e-08}, {'mark_off': []}, {'mark': [-1.486e-09, -2.047e-09, 8.65054638070647e-10, 4.57672e-10, 1.5096e-09, -1.801e-09, -2.051e-09]}]}, {'state_type': 'PROD'}]}]
谢谢,仔细察看了代码,有个地方抄错了,现在可以了。谢谢。
2018-08-10 17:33
老鼠不相往来
泡菜 邮箱已验证 手机已验证
泡网分: 0.748
主题: 93
帖子: 1026
注册: 2012年03月
强转json标准格式算法,几行就能解决(忽略类型,全部string)

2018-08-10 17:27
老鼠不相往来
泡菜 邮箱已验证 手机已验证
泡网分: 0.748
主题: 93
帖子: 1026
注册: 2012年03月
fukewu 发表于 2018-8-10 17:04
谢谢哈,码了这么一长段代码。
我试了试,没有成功。
这是一段简单的文本
{sequence = [551250,44157,4351],tag = "VR-ZZ08",format = 83009,type = vertical:focus_parameters,data = {align_mark_type = TRANSIMISSION,top_plate_name = TOP_DIFRACTION_PLATE,t_y = 94.294e-3,v_plane = {Z = 726.429e-9,Rx = 0.0,Ry = 63.947e-9},mark_off = {mark_used = [TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE],mark = [-1.486e-9,-2.047e-9,865.054638070647e-12,457.672e-12,1.5096e-9,-1.801e-9,-2.051e-9]},state_type = PROD}}

准备用剥洋葱的方式,用递归法把它搞出来。
你的新例子跟之前的变化是 = 变成了(空格)=(空格)

加一句就行了

#正则分段
        str = str.replace(" = ", "=");

执行正常

[{'sequence': [551250, 44157, 4351]}, {'tag': 'VR-ZZ08'}, {'format': 83009}, {'type': 'vertical:focus_parameters'}, {'data': [{'align_mark_type': 'TRANSIMISSION'}, {'top_plate_name': 'TOP_DIFRACTION_PLATE'}, {'t_y': 0.094294}, {'v_plane': [{'Z': 7.26429e-07}, {'Rx': 0.0}, {'Ry': 6.3947e-08}, {'mark_off': []}, {'mark': [-1.486e-09, -2.047e-09, 8.65054638070647e-10, 4.57672e-10, 1.5096e-09, -1.801e-09, -2.051e-09]}]}, {'state_type': 'PROD'}]}]
2018-08-10 17:23
mkxzy
泡菜 邮箱已验证 手机已验证
泡网分: 2.75
主题: 8
帖子: 148
注册: 2011年01月
qwerty:fgfdfh

这个是什么类型数据 本帖最后由 mkxzy 于 2018-8-10 17:17 编辑
2018-08-10 17:16
excalibur2
泡菜 邮箱已验证 手机已验证
泡网分: 5.038
主题: 136
帖子: 3918
注册: 2011年03月
lz如果你的"键值"都是带双引号的话, 用json很好解决. 不带的话, 就需要自己写代码了
2018-08-10 17:12
mkxzy
泡菜 邮箱已验证 手机已验证
泡网分: 2.75
主题: 8
帖子: 148
注册: 2011年01月
感觉用语法分析器来实现比较好
2018-08-10 17:12
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
谢谢哈,码了这么一长段代码。
我试了试,没有成功。
这是一段简单的文本
{sequence = [551250,44157,4351],tag = "VR-ZZ08",format = 83009,type = vertical:focus_parameters,data = {align_mark_type = TRANSIMISSION,top_plate_name = TOP_DIFRACTION_PLATE,t_y = 94.294e-3,v_plane = {Z = 726.429e-9,Rx = 0.0,Ry = 63.947e-9},mark_off = {mark_used = [TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE],mark = [-1.486e-9,-2.047e-9,865.054638070647e-12,457.672e-12,1.5096e-9,-1.801e-9,-2.051e-9]},state_type = PROD}}

准备用剥洋葱的方式,用递归法把它搞出来。
2018-08-10 17:04
老鼠不相往来
泡菜 邮箱已验证 手机已验证
泡网分: 0.748
主题: 93
帖子: 1026
注册: 2012年03月
nahcooo 发表于 2018-8-10 00:54
同一段代码里混用tab和空格?怎么运行成功的?
is_number函数是copy过来的,同一个函数段一致就行吧,windows下运行没有问题
我的方法不严谨,只支持一层{},[]包含,再深少数层次需要修改正则规则,任意深度估计需要用堆栈匹配左右括号
2018-08-10 08:06
nahcooo
资深泡菜 邮箱已验证 新浪实名验证通过
泡网分: 23.987
主题: 256
帖子: 10268
注册: 2008年06月
老鼠不相往来 发表于 2018-8-9 23:21
不太难吧,顺手写了个
代码发不上来,报错
发图吧,至少实验代码是通过了

同一段代码里混用tab和空格?怎么运行成功的?
2018-08-10 00:54
老鼠不相往来
泡菜 邮箱已验证 手机已验证
泡网分: 0.748
主题: 93
帖子: 1026
注册: 2012年03月
不太难吧,顺手写了个
代码发不上来,报错
发图吧,至少实验代码是通过了
本帖最后由 老鼠不相往来 于 2018-8-9 23:25 编辑





2018-08-09 23:21
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
盲目信仰 发表于 2018-8-9 22:49
没看懂你是想怎么做,最好贴一段文本,然后贴一段转换后的格式,再大概描述一下转换规则
数据就是首贴那样的,我更改了字符而已。
2018-08-09 23:03
盲目信仰
资深泡菜 邮箱已验证 手机已验证
泡网分: 25.381
主题: 67
帖子: 6596
注册: 2005年02月
没看懂你是想怎么做,最好贴一段文本,然后贴一段转换后的格式,再大概描述一下转换规则
2018-08-09 22:49
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
呼唤人工智能,按道理,这玩意最适合人工智能了。
2018-08-09 21:36
wangjun861205
泡菜 邮箱已验证 手机已验证
泡网分: 0.772
主题: 32
帖子: 943
注册: 2006年08月
多种格式的混合,直接弄挺麻烦, 个人建议,先用正则处理格式,试着往json上靠,如果能完全替换成json的格式是最好,不行的话,只能自己写解析,不过这种嵌套多层的,数据量又大,除非你能保证格式绝对正确,否则,少几个括号就够你折腾的。而且,如果没有语法定义,你可能得一点一点的试,不停的报错,不停的改,得有点耐心
2018-08-09 20:47
zzlay
泡菜 邮箱已验证 手机已验证
泡网分: 3.62
主题: 150
帖子: 2524
注册: 2012年09月
马克一下,貌似这就是数据挖掘的深水区了
本帖由安卓客户端发布
2018-08-09 20:14
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
nahcooo 发表于 2018-8-9 18:45
试试正则表达式?
正则表达式只能挖出来数据,挖出来的是tuple类的数据。而原来的数据一看就是套了很多层的字典。
2018-08-09 20:06
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
wangzhecnhit 发表于 2018-8-9 20:01
格式统一不?如果不统一比较麻烦
data里的格式不统一,{}套几层或套不少[ ], 或混合,里面的数据个数也不一样。 本帖最后由 fukewu 于 2018-8-9 20:04 编辑
2018-08-09 20:04
wangzhecnhit
资深泡菜 手机已验证
泡网分: 5.724
主题: 57
帖子: 11291
注册: 2008年11月
fukewu 发表于 2018-08-09 18:32
有上亿段文本数据,长短不一,都是这样的格式
{dd=,tag="ff—gg98",formtt=97,type=qwerty:fgfdfh...
格式统一不?如果不统一比较麻烦
本帖由安卓客户端发布
2018-08-09 20:01
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
dchina 发表于 2018-8-9 19:14
import json

json.loads(内容)
json好像玩不动这个。
2018-08-09 19:36
dchina
泡菜 邮箱已验证 手机已验证
泡网分: 18.772
主题: 3
帖子: 900
注册: 2006年04月
import json

json.loads(内容)
本帖由 无忌论坛V3.1.0 iPhone5/5s iOS11.3.1 客户端发布
2018-08-09 19:14
fukewu
资深泡菜 手机已验证
泡网分: 33.019
主题: 106
帖子: 2933
注册: 2002年01月
nahcooo 发表于 2018-8-9 18:45
试试正则表达式?
有试过,没找到好通用规则,过几天再试试。
2018-08-09 18:50
nahcooo
资深泡菜 邮箱已验证 新浪实名验证通过
泡网分: 23.987
主题: 256
帖子: 10268
注册: 2008年06月
试试正则表达式?
2018-08-09 18:45
回复

关于我们  联系我们  法律顾问  管理团队  网站导航 
©版权所有:色影无忌  网站备案/许可证号 桂B2-20040025-1  互联网站备案通告


网站投诉举报电话:0771-2094586 | 网站举报邮箱:webmaster@xitek.com