[問題] 怎麼由 *.csv 自動建立陣列?[已解決]

看板Python作者 (Ethan)時間6年前 (2019/01/16 16:05), 6年前編輯推噓2(2023)
留言25則, 2人參與, 6年前最新討論串1/1
安安大家好,小弟 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://www.ptt.cc/bbs/Python/M.1547625918.A.1BC.html

01/16 16:09, 6年前 , 1F
試試看 eval
01/16 16:09, 1F
感謝大大,我現在就來搜尋 !! 大大,剛搜尋了一下,看不太懂這 eval 可以拿來做些什麼...Orz 我繼續研究研究

01/16 16:22, 6年前 , 2F
應該是要用 exec 才對 0.0
01/16 16:22, 2F
哦哦我查查看...

01/16 16:23, 6年前 , 3F
你可以用來 assign 現在不存在的變數
01/16 16:23, 3F

01/16 16:23, 6年前 , 4F
只要把字串的邏輯寫好就好
01/16 16:23, 4F
大大您的意思是說,我可以用 exec 來執行現在不存在的變數嗎? 所以 exec 並不是用來自動讀取 *.csv 並自動建立陣列的囉?

01/16 16:28, 6年前 , 5F
恩恩 所以你裡面的 var_1, 2, 3... 可以用這個來解決
01/16 16:28, 5F
了解,這是我遇到的第一個有點難理解的東西 XD 需要花點時間來瞭解怎麼用了.. 謝謝大大... 那想請問不曉得您對於「自動建立陣列」有什麼想法嗎? 感覺至少要先建立了陣列,才能使用 exec ?

01/16 20:48, 6年前 , 6F
這個問題取決於你之後資料要怎麼做處理
01/16 20:48, 6F
大大您好,我之後會對曲線微分積分,而且會將每條曲線之間作四則運算或積分等。 但因為每個曲線的數據點不盡相同,所以我在進行曲線之間的運算之前,我會需要 先重整化每條曲線的數據,意思是說,讓他們有著相同的 x 座標。方法大概是 簡單的內插外插法。 仔細想下去感覺很難,因為我的 array 命名...

01/16 21:17, 6年前 , 7F
WOW 好簡潔整齊的 code ........ (羨慕佩服 我研究一下!十分感謝大大幫助啊!!!想了好久 ※ 編輯: Philethan (123.192.0.245), 01/16/2019 21:20:43

01/16 21:20, 6年前 , 8F
你 arry 命名、順序重不重要?
01/16 21:20, 8F

01/16 21:22, 6年前 , 9F
裡面需要改善的事: dict -> OrderedDict, 去除無用的値
01/16 21:22, 9F

01/16 21:22, 6年前 , 10F
list 類別要改為 numpy 的類別
01/16 21:22, 10F

01/16 21:23, 6年前 , 11F
dict 可以由 dict.keys() 取得 key 值列表
01/16 21:23, 11F

01/16 21:24, 6年前 , 12F
變數規則如果不只單空格,可以用 rsplit或是 regexp
01/16 21:24, 12F
大大您好,我執行原本的 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 長度就停止在這,否則之後繪圖可能會有些問題>< 非常感謝大大幫助!

01/16 21:29, 6年前 , 13F
這就是切割字串的問題囉~
01/16 21:29, 13F

01/16 21:30, 6年前 , 14F
"too many values to unpack" 是因為右側執行結果多餘
01/16 21:30, 14F

01/16 21:31, 6年前 , 15F
左側的變數數量,所以我才說你要用 rsplit 或 re
01/16 21:31, 15F

01/16 21:32, 6年前 , 16F
'AA BB CC'.rsplit(' ', 1) == ['AA BB','CC']
01/16 21:32, 16F
大大我好像了解了,因為我另一個 *.csv 檔案的曲線名稱中有空格。 原則上是以 , 作為分割 :) 我查一下您說的 resplit,十分感謝您!

01/16 21:33, 6年前 , 17F
這些問題你都能解決,先搞清楚自己要解決的問題
01/16 21:33, 17F

01/16 21:34, 6年前 , 18F
去找相關的關鍵字應該都不是問題
01/16 21:34, 18F
好的,非常感謝您,已經有非常多嘗試的方向!感謝大大!

01/16 21:35, 6年前 , 19F
至於 '-' 的問題, for 迴圈有 continue 可以用
01/16 21:35, 19F
哦!感謝大大,我以前是用網路上找到的 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

01/16 23:35, 6年前 , 20F
其實你不見得要 exec ,不過堪用就好... 囧
01/16 23:35, 20F
小弟我只會這個...其實也是剛剛才學會的哈哈 不知道大大您有沒有其他建議 >< ※ 編輯: Philethan (123.192.0.245), 01/16/2019 23:36:52

01/17 00:00, 6年前 , 21F
只是對 python 基本型別的 method 不熟而已
01/17 00:00, 21F

01/17 00:00, 6年前 , 22F
建議也沒甚麼,其實不用把要圖的內容賦值到變數也話得出
01/17 00:00, 22F

01/17 00:01, 6年前 , 23F
01/17 00:01, 23F

01/17 00:01, 6年前 , 24F
用 exec 製造很多變數其實最後你還是把他帶到同個函數
01/17 00:01, 24F

01/17 00:02, 6年前 , 25F
這樣的用法和你用 for 迴圈畫圖差不多意思思
01/17 00:02, 25F
哦哦 那如果不用 exec 製造 array,有辦法處理各曲線的微分、積分與互相的 四則運算嗎?原來有辦法用 for loop 畫圖哦@@感謝!我再來學學 XD ※ 編輯: Philethan (123.192.0.245), 01/17/2019 00:06:07
文章代碼(AID): #1SFkM-6y (Python)
文章代碼(AID): #1SFkM-6y (Python)