作者Philethan (Ethan)
看板Python
标题[问题] 怎麽由 *.csv 自动建立阵列?
时间Wed Jan 16 16:05:14 2019
安安大家好,小弟 python 新手。
因实验缘故,我经常会有个 *.csv 档,例如这个 gist 里头的
第二份档案 APD23_BDlines.csv,
https://gist.github.com/3847082e32d93eeead73b3acb7fc1914.git
第一份档案 APD23.py 是我读取 *.csv 的方式。在这个 APD23_BDlines.csv
里面有很多条曲线的 (x,y) 座标,大致如下
DopingConcentration(C1(n300_des_2)) X DopingConcentration(C1(n300_des_2)) Y
DopingConcentration(C1(n302_des)) X DopingConcentration(C1(n302_des)) Y
DopingConcentration(C1(n304_des)) X DopingConcentration(C1(n304_des)) Y
....
而我希望能够写个程式,将每条曲线的 (x,y) 座标分别存入两个阵列。我的步骤是:
1. 判断每条曲线有多少个数据点
2. 为每条曲线建立 array
3. 读取数据,将数据存入 array
上述连结中的第一份程式码 APD23.py 是我的实际作法。
这样的步骤让我很疲累,因为其实我的 *.csv 格式都是一样的。
1. 第一横列,都是我的资料名称,并且以 x1, y1, x2, y2, ... 规则排列
2. 各直行的第二横列底下,都是我的资料。
所以我希望能够
1. 自动判断有多少组 (x,y) 并建立相对应的阵列数目,自动命名阵列与设定阵列长度。
2. 自动将 *.csv 中的数据储存至每个阵列中
我想了很久,都不知道怎麽做 QQ 有大大可以教我吗 >< 因为我
想快速分析很多资料,但这样人为建立阵列实在是太耗时了。
而如果自动命名与建立阵列,那我其实也不知道该怎麽写这种
「尚未存在的阵列」的数据处理程式...因为我连名字都不知道 QQ
请各位大大帮忙一下 >< 感谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.192.0.245
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1547625918.A.1BC.html
1F:推 sherees: 试试看 eval 01/16 16:09
感谢大大,我现在就来搜寻 !!
大大,刚搜寻了一下,看不太懂这 eval 可以拿来做些什麽...Orz 我继续研究研究
2F:推 sherees: 应该是要用 exec 才对 0.0 01/16 16:22
哦哦我查查看...
3F:→ sherees: 你可以用来 assign 现在不存在的变数 01/16 16:23
4F:→ sherees: 只要把字串的逻辑写好就好 01/16 16:23
大大您的意思是说,我可以用 exec 来执行现在不存在的变数吗?
所以 exec 并不是用来自动读取 *.csv 并自动建立阵列的罗?
5F:→ sherees: 恩恩 所以你里面的 var_1, 2, 3... 可以用这个来解决 01/16 16:28
了解,这是我遇到的第一个有点难理解的东西 XD 需要花点时间来了解怎麽用了..
谢谢大大...
那想请问不晓得您对於「自动建立阵列」有什麽想法吗?
感觉至少要先建立了阵列,才能使用 exec ?
6F:→ s860134: 这个问题取决於你之後资料要怎麽做处理 01/16 20:48
大大您好,我之後会对曲线微分积分,而且会将每条曲线之间作四则运算或积分等。
但因为每个曲线的数据点不尽相同,所以我在进行曲线之间的运算之前,我会需要
先重整化每条曲线的数据,意思是说,让他们有着相同的 x 座标。方法大概是
简单的内插外插法。
仔细想下去感觉很难,因为我的 array 命名...
WOW 好简洁整齐的 code ........ (羡慕佩服
我研究一下!十分感谢大大帮助啊!!!想了好久
※ 编辑: Philethan (123.192.0.245), 01/16/2019 21:20:43
8F:→ s860134: 你 arry 命名、顺序重不重要? 01/16 21:20
9F:→ s860134: 里面需要改善的事: dict -> OrderedDict, 去除无用的値 01/16 21:22
10F:→ s860134: list 类别要改为 numpy 的类别 01/16 21:22
11F:→ s860134: dict 可以由 dict.keys() 取得 key 值列表 01/16 21:23
12F:→ s860134: 变数规则如果不只单空格,可以用 rsplit或是 regexp 01/16 21:24
大大您好,我执行原本的 APD23_BDlines.csv 时成功了!
但是如果换成别的 *.csv 档就会出现 error
Traceback (most recent call last):
File "/Users/..../code_ptt.py", line 25, in <module>
result = parse_csv(csv_path)
File "/Users/..../code_ptt.py", line 11, in parse_csv
curve_name, x_y = fieldname.split(' ')
ValueError: too many values to unpack (expected 2)
Process finished with exit code 1
array 命名部分,如果能够为指明是曲线A的x座标,曲线B的y座标,那就太好了QQ
我以前是这样:
曲线A的x座标:xA = [xA1, xA2, xA3, ...., xA650]
曲线A的y座标:yA = [yA1, yA2, yA3, ...., yA650]
曲线B的x座标:xB = [xB1, xB2, xB3, ...., xB310]
曲线B的y座标:yB = [yB1, yB2, yB3, ...., yB310]
另外在同一份 *.csv 中,不同曲线的数据数目不同,所以会有 - 符号出现。
这时我希望可以让 array 长度就停止在这,否则之後绘图可能会有些问题><
非常感谢大大帮助!
13F:→ s860134: 这就是切割字串的问题罗~ 01/16 21:29
14F:→ s860134: "too many values to unpack" 是因为右侧执行结果多余 01/16 21:30
15F:→ s860134: 左侧的变数数量,所以我才说你要用 rsplit 或 re 01/16 21:31
16F:→ s860134: 'AA BB CC'.rsplit(' ', 1) == ['AA BB','CC'] 01/16 21:32
大大我好像了解了,因为我另一个 *.csv 档案的曲线名称中有空格。
原则上是以 , 作为分割 :)
我查一下您说的 resplit,十分感谢您!
17F:→ s860134: 这些问题你都能解决,先搞清楚自己要解决的问题 01/16 21:33
18F:→ s860134: 去找相关的关键字应该都不是问题 01/16 21:34
好的,非常感谢您,已经有非常多尝试的方向!感谢大大!
19F:→ s860134: 至於 '-' 的问题, for 回圈有 continue 可以用 01/16 21:35
哦!感谢大大,我以前是用网路上找到的
def isfloat(value):
try:
float(value)
return True
except ValueError:
return False
感谢很麻烦,还要一直用 if condition 判断 True or False,我待会来
研究如何用 continue 处理 '-',感觉很简便!我先研究一下怎麽依照逗点分割..
---
阿阿原来大大您早就在推文指出该怎麽改了,抱歉我资质太差,现在才看懂XD
感谢您 已经没有 error 了!我可接着着手後面的array了^^
已完成拉!!谢谢楼上各位大大的协助!真的是非常感谢 :)
我的Code:
https://paste.ofcode.org/EXMECLrxyeujHi8nsvppcB
20F:→ s860134: 其实你不见得要 exec ,不过堪用就好... 囧 01/16 23:35
小弟我只会这个...其实也是刚刚才学会的哈哈
不知道大大您有没有其他建议 ><
※ 编辑: Philethan (123.192.0.245), 01/16/2019 23:36:52
21F:→ s860134: 只是对 python 基本型别的 method 不熟而已 01/17 00:00
22F:→ s860134: 建议也没甚麽,其实不用把要图的内容赋值到变数也话得出 01/17 00:00
23F:→ s860134: 画 01/17 00:01
24F:→ s860134: 用 exec 制造很多变数其实最後你还是把他带到同个函数 01/17 00:01
25F:→ s860134: 这样的用法和你用 for 回圈画图差不多意思思 01/17 00:02
哦哦 那如果不用 exec 制造 array,有办法处理各曲线的微分、积分与互相的
四则运算吗?原来有办法用 for loop 画图哦@@感谢!我再来学学 XD
※ 编辑: Philethan (123.192.0.245), 01/17/2019 00:06:07