作者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/m.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