📜 [專欄新文章] 類 Python 的合約語言 Vyper 開發入門:與 Solidity 差異、用 Truffle 部署、ERC20 賣幣合約實做
✍️ 田少谷 Shao
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
有鑒於個人近期關注的 Uniswap 及 Curve 皆用 Vyper 實作,索性瀏覽了官方文件並嘗試一些開發工具,希望此文能減少一些讀者初嘗 Vyper 會遇到的麻煩!
Vyper and Solidity
Outline
一. Vyper 極簡介二. 與 Solidity 語法差異三. 開發、開發環境設置 1. 語法高亮 2. 本地 Vyper compiler 安裝 3. 使用 Truffle 操作 ERC20 - 安裝 Truffle - 發幣 - 寫個簡易賣幣合約四. 已知 Remix 問題 五. 結語
一. Vyper 極簡介
Vyper 是除 Solidity 外,以太坊上的另一智能合約 (Smart contract) 語言。其語法和 Python 相近,但畢竟也是寫合約的語言,邏輯差異不大,所以若熟悉 Solidity 應該不難理解用 Vyper 寫出的合約!
Vyper 主要被設計和 Solidity 的區別是安全性及可讀性,這部分會在下一段落及後方的實作中舉例說明。
二. 與 Solidity 語法差異
Vyper 與 Solidity 的差異有許多,在本段只就個人認為感受較深的三點進行說明,其他差異只進行翻譯,有興趣的讀者可以到官方文件詳細了解:https://vyper.readthedocs.io/en/latest/index.html
1. 沒有 modifier
Solidity 常見的 onlyOwner() modifier; 由於 gist 沒有 Solidity 的語法高亮,故截圖
在 Vyper 中單純用 assert 及 assert_modifiable 來進行條件檢查,兩者差別為若要檢查函數執行後的返還值,要用後者,如下圖:
Vyper 寫法
2. 沒有 Class inheritance 繼承
繼承是物件導向程式設計 (OOP) 的核心概念,但各種繼承關係有時候確實很複雜。Vyper 沒有繼承,這無疑大幅地增加了程式可讀性及安全性,以及降低審計程式碼的難度。在此提供一個例子供不熟悉 OOP 複雜之處的讀者有個概念:
source: https://consensys.github.io/smart-contract-best-practices/recommendations/#multiple-inheritance-caution
在上例中,contract A 的 fee 值 (因繼承自 contract B 和 C,故有 fee 一值) 是 5、a 值也是 5 (因繼承自 contract Final,故有 a 一值)。原因是 A 先繼承 B 再繼承 C,因此 contract A 中的 setFee() 是使用了 contract C 的 setFee(),而 a 值是由於 C(5),這代表 contract C 的 constructor (舊版本中即 function C(),函式名稱同 contract 名稱) 被傳入的值為 5。
稍微延伸一下以上概念,將 contract A 改成:contract A is C, B。如此一來,a 值還有 fee 值都會是 3,因為這次 A 先繼承 C 再繼承 B,因此最終吃到的值是 contract B 的。
以上就是 OOP 繼承的複雜之處的簡單範例說明,應該能稍微感受到爲什麼除去繼承後會大幅提高可讀性及安全性,畢竟即使是熟悉 OOP 的人有時頭腦一混亂也會開始懷疑自己寫的程式碼繼承結構是否正確 …
3. 沒有 dynamic array 動態陣列
這應該是目前 Vyper 設計中爭議最大的部分。沒有動態陣列代表在宣告陣列時需要宣告其長度,也就是說 Solidity 中的寫法 uint[], bool[] 等等,這些是不會出現在 Vyper 的。在 Vyper 中只能出現諸如:
# Vyper 的變數宣告方式為 變數名稱: 存取範圍(變數型態(若為陣列給長度))
values: uint256[10]participants: public(address[20])
可以看到上方的 uint256 及 address 兩陣列皆需要宣告長度,不能不宣告而使其動態地配置空間。
沒有動態陣列固然可以確保執行運算的範圍、次數,但一來動態陣列真的很方便、二來在 Solidity 有此功能而 Vyper 卻沒有的情況下可能會造成麻煩,詳見此一討論串:點我。
4. 沒有 inline assembly,程式碼中不會有組合語言
5. 沒有 function overloading,函式不會因傳入的參數數目不同而結果不同
6. 沒有 operator overloading,運算符號不會有不同於預設的自定義功能
7. 沒有無限迴圈,可免於 gas limit attack
8. 十進位定點數 decimal fixed point 而非二進位 (binary) 定點數,詳見:點我
三. 開發、開發環境設置
結論先講
開發 Vyper 的最佳姿勢目前個人認為是在本地裝上 Vyper compiler、用 Truffle 部署,並在撰寫時將檔名後加上 .py 就能有 Python 的語法高亮👌
1. 語法高亮 (syntax highlighting)
有語法高亮絕對是舒服地寫程式的第一步。
Remix 有 Vyper 的語法高亮,但一來個人目前不推薦使用 Remix 來撰寫 Vyper,原因詳見下方 4. 已知 Remix 問題;二來 Remix 的語法高亮其實也沒有很清楚,因此個人推薦:在本地開發,將檔名後加上 .py 就會有 Python 的語法高亮。
2. 本地 Vyper compiler 安裝
照官方說明使用 Python 的虛擬環境 virtualenv:
source: https://vyper.readthedocs.io/en/latest/installing-vyper.html#installing-vyper
簡單兩點提醒:
如果中間那行報錯但確實已經有 Python,則可能是版本問題。依照自己電腦上的版本改成相應的即可,ex: python3.6 改成 python3
進入虛擬環境後(檔案路徑前方應有 vyper-venv 的提示),使用此指令: vyper {檔案名稱}.vy,即可編譯 .vy 檔;使用完畢後輸入 deactivate 即可退出
3. 使用 Truffle 操作 ERC20
安裝 Truffle
Truffle 雖有冗餘的 migration 但也別無他法,畢竟 Remix 目前仍不完善 :(
下載流程可以照官方文件,使用 vyper-example:
source: https://github.com/truffle-box/vyper-example-box
由於我們會接上測試網 Ropsten,因此還要下載 truffle-hdwallet-provider:
source: https://github.com/trufflesuite/truffle-hdwallet-provider
接者就可以開始使用 Vyper 寫合約了!
發幣
由於 Vyper 的官方文件中已經有許多優質範例,因此本文希望來點不一樣但大家卻又很熟悉的…以 ERC20 為例(這千篇一律的主題xD):
用 Curve 的 ERC20 程式碼為範本,發一個幣(又要發…)
寫一個簡易賣幣合約
選擇這個主題一方面畢竟 ERC20 是以太坊的最大宗應用之一,二來有興趣的讀者可以透過讀 ERC20 的程式碼來熟悉 Vyper,並在看過本文的流程後對於用 Vyper+Truffle 來操作 ERC20 有完整的概念!
好的,首先複製一份 Curve 的 ERC20 程式碼(看到就順手拿來用),並複製到 Truffle 所在路徑的 contracts 資料夾中:https://github.com/curvefi/curve-contract/blob/pool_compound/vyper/ERC20.vy
由於第一點希望著重在跑一次流程,因此不改動合約的程式碼。
將 ERC20.vy 複製到 contracts 資料夾中後,到 migrations 資料夾開啟 2_deploy_contracts.js,首先將 require() 中的參數改為 ERC20.vy 的檔名 ERC20,再來依照自己喜好決定幣的名稱、代號、小數點位數及發行總量,輸入於 deployer.deploy() 中。
接著,為了和測試網 Ropsten 互動,需要將以下程式碼寫入 truffle-config.js。
第二行的 privateKeys 是帳號的私鑰。以下實作需要兩個帳號來操作,因此請從錢包匯入兩組私鑰(並非助憶詞)。
在第 13 行中 HDWalletProvider 此函式的第三個參數代表要用第幾個帳號最為預設帳號(部署合約等),第四個函數代表總共匯入幾組帳號。而第二個參數則是需要至 Infura 申請一個 project 來得到串接 Ropsten 的連結。這兩步驟並非本文重點,因此不詳細解說步驟,Google 搜尋關鍵字應該就會找到方法!
接著,就可以輸入以下指令來將代幣發佈到 Ropsten:
truffle deploy --network ropsten
有進入虛擬環境才可以編譯 .vy 檔,若忘記就會收到如下的錯誤訊息:
記得打開虛擬環境才能編譯 .vy 檔
成功後就可以在 contract address 中看到代幣發佈的位置,加入到 Metamask 中就可以看到。本文的例子是維尼代幣 Winnie the Coin, WTC ;)
contract address 便是 ERC20 的所在
Winnie the Coin, WTC
好了,到此測試網上又多了一個測試用的垃圾廢幣。
寫個簡易賣幣合約
賣幣合約中我想要簡單有兩個功能就好:付錢買幣 、結束銷售,以下就是程式碼。買幣的部分就不寫太詳細,固定價格為 0.01 Ether 可以買 500 代幣。
簡單說明幾點:
Solidity 的 constructor() 在 Vyper 中為 Python 風的 __init__():
函式的屬性(public, private, payable 等等)放在函式上方,與 Python 的修飾器位置相同
總之寫法跟 Python 很像,次方也一樣是用兩次乘法代表:**
變數前加上 self 代表是當前合約的變數/全域變數,因此非常容易與函式中的變數/區域變數做區隔
由於已經在第一行匯入了 ERC20 那份合約,因此透過將地址傳入合約當參數,就可以呼叫在該地址的合約:ERC20(self.tokenAddress) 。並且,可以將部署的合約存成一個變數 erc20 較方便
寫完合約後一樣要更改 migrations 資料夾中的 2_deploy_contracts.js 如下,將代幣所在的地址作為參數輸入。
由於先前已經部署過一次了,因此要重置才能再部署第二次,輸入以下指令:
truffle deploy --reset --network ropsten
部署成功之後就要來試著買幣啦!輸入以下來進入 console:
truffle console --network ropsten
成功進入後應該會看到 truffle(ropsten)> 的字樣。接著,首先取得部署的兩合約,並查看是否有返回合約資訊:
# ERC20 及 SellToken 是先前在 2_deploy_contracts.js 中的變數名稱,代表被部署的合約
let instance1 = await ERC20.deployed()instance1 # 印出 instance1 的資訊
let instance2 = await SellToken.deployed()instance2 # 印出 instance2 的資訊
再來,為了讓 SellToken 可以賣幣,要先用 ERC20 的合約匯幣到 SellToken 的合約。因此,輸入以下指令:
instance1.transfer(instance2.address, 10000)
# 這裡數字只要設為 > 500 就可以
接著,我們要利用第二個帳號去買幣(第一個帳號為預設帳號,因此就是代幣擁有者)。將帳號的資訊存入變數 accounts 中,再指定送出交易的帳號是第二個帳號。由於我個人匯入私鑰的順序是將第一個帳號存在 truffle-config.js 的 privateKeys[0]、第二個帳號存在 privateKeys[1],因此第二個帳號的地址就會在 accounts[1] 的位置:
let accounts = await web3.eth.getAccounts()
instance2.buyToken({from: accounts[1], value: 10000000000000000})
# value 為 10^16 是因為在 SellToken 的 buyToken 函式中買一次要 0.01 Ether, 即為 10^16 wei
然後應該就會在自己的第二個帳號中看到匯入的幣了~
最後,由於合約中結束銷售就是一個自殺 selfdestruct 函式,因此可以呼叫看看,第一個帳戶錢包中的錢應該會增加,因為第二個帳戶有付款買幣;並且,可以到 Ropsten 上瀏覽,應該能看到相關提示:
中間 contract 的右上角有 Self Destruct 的樣式
四. 已知 Remix 問題
Remix 目前有兩個版本,只有新版有 Vyper 的編譯器。在此整理目前遇到的問題,如果有人也遇到可以對照一下本處,可以省去很多自我懷疑xD
不會報錯
Remix 的編譯結果有時會是錯的、和本地端編譯出來的結果不同
舉上方的 SellToken 合約為例,將其複製到 Remix 中使用左邊的 Remote Compiler 有錯,但又不報錯 q_q (ERC20 的合約有在同檔案目錄)
左方有紅色三角形,代表編譯失敗,但沒有報錯訊息可以看…
getter function 竟然要花錢
用 Solidity 寫的合約,查詢 public 變數的值應該是不用消耗 gas 的,但不知何故查詢 Vyper 寫的合約的 public 變數卻要消耗 gas,如下圖…
可以看到中下方有 22026 gas 的消耗
Local compiler 無法使用
圖中的 Local Compiler 此選項,個人雖照官方文件執行 vyper-serve 但卻失敗,因此若有讀者成功希望能留個言不吝分享!
五. 結語
Vyper 作為一個比 Solidity 更新的合約語言,在寫程式碼的方面沒什麼問題,但相關的開發工具、學習資源等都遠不及 Solidity。
Vyper 主打的兩個特色:可讀性的部分相信看完上面的讀者應該已經有些感覺;安全性…小白如作者我倒是沒有感受到顯著的不同。況且 Solidity 已經發展許久,很多錯誤的寫法、知名的安全漏洞大家應該也很熟悉了,還有 Openzeppelin 提供安全合約寫法的範本,因此有待以後高人解說安全性是否真的是 Vyper 較好。
有興趣者可以查看 Vyper 的安全報告:點我,大意是目前 Vyper 的編譯器仍有許多問題待改進! (感謝 Chih-Cheng Liang 的提供)
本文對 Vyper 的介紹及其與 Solidity 的差異只講了個大概,欲知更詳細的介紹還是要麻煩讀者前往官方文件了:https://vyper.readthedocs.io/en/latest/index.html
最後,如果本文有任何錯誤,請不吝提出,我會盡快做修正;而如果我的文章有幫助到你,可以看看我的其他文章,歡迎一起交流 :)
田少谷 Shao - Medium
類 Python 的合約語言 Vyper 開發入門:與 Solidity 差異、用 Truffle 部署、ERC20 賣幣合約實做 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有156部Youtube影片,追蹤數超過4萬的網紅吳老師教學部落格,也在其Youtube影片中提到,Python基礎程式語言應用證照班第8次上課 01_重點回顧與用串列計算成績 02_計算人數總分平均最高低分 03_成績改為外部讀取檔案 04_讀取檔案與切割資料並轉為數字 05_用檔案物件寫出成績報表 06_串接為s1字串變數後再輸出 07_串接重點與讀取會員資料 08_只讀取前十個會員資料 0...
「python字串轉數字」的推薦目錄:
- 關於python字串轉數字 在 Taipei Ethereum Meetup Facebook 的精選貼文
- 關於python字串轉數字 在 紀老師程式教學網 Facebook 的精選貼文
- 關於python字串轉數字 在 紀老師程式教學網 Facebook 的最讚貼文
- 關於python字串轉數字 在 吳老師教學部落格 Youtube 的最佳解答
- 關於python字串轉數字 在 吳老師教學部落格 Youtube 的最讚貼文
- 關於python字串轉數字 在 吳老師教學部落格 Youtube 的精選貼文
- 關於python字串轉數字 在 Re: [問題] pandas.to_csv 字串型態的數字- 看板Python - 批踢踢 ... 的評價
- 關於python字串轉數字 在 Python hex string to int 16進位字串轉數字 的評價
- 關於python字串轉數字 在 Python 數字、字串的基本運算By 彭彭 - YouTube 的評價
python字串轉數字 在 紀老師程式教學網 Facebook 的精選貼文
[免費教學] 千萬次播放的 Python 初學者影音課程,四個半小時馬拉松連播!
(含簡體中文字幕)
YouTube 網址: https://youtu.be/rfscVS0vtbw
------------
大家 2020 年新年快樂! :-D
今天要介紹給大家的,是我在 YouTube 上找到的一部四個半小時的影片:「學習 Python - 初學者全教程」。它一口氣把 Python 的基礎語法,在一支影片裡全部講出來!雖然沒有涵蓋到 Python 所有語法,但 80% 的情況也夠用了!希望大家會喜歡!
影片雖然是英文發音,但是已經有熱心人士,翻譯出十種語言的字幕了。其中也包含「簡體中文」。如果您對於直接聽英文沒有信心的話,可以把簡體中文字幕打開,應該能幫助您更好了解影片的內容。
附上該影片內容的時軸索引。如果您有特別想聽的內容,可以直接跳到特定時間點觀看:
0:00 簡介
1:45 環境安裝(IDLE & PyCharm)
6:40 設定&您的第一個程式
10:23 繪製幾何圖形
15:06 變數與資料型態
27:03 如何在 Python 內使用文字
38:18 如何在 Python 內使用數字
48:26 讀取使用者的輸入
52:37 範例:一個簡單的計算機
58:27 範例:填字遊戲
1:03:10 資料結構:串列(Lists)
1:10:44 串列相關函數
1:18:57 資料結構:元組(Tuples)
1:24:15 函數
1:34:11 函數傳回值
1:40:06 分支(if 指令)
1:54:07 分支與比較運算子
2:00:37 範例:改良簡單的計算機
2:07:17 資料結構:字典(Dictionaries)
2:14:13 迴圈(while 指令)
2:20:21 範例:猜字遊戲
2:32:44 迴圈(for 指令)
2:41:20 範例:製作一個指數函數
2:47:13 二維串列與巢狀迴圈
2:52:41 範例:一個簡單的翻譯器
3:00:18 註解(Comments)
3:04:17 例外處理(Try/Except 指令)
3:12:41 讀取檔案內容
3:21:26 寫資料到一個檔案裡
3:28:13 模組製作與安裝
3:43:56 類別與物件
3:57:37 範例:建立一個選擇題測驗
4:08:28 物件相關函數
4:12:37 物件導向的「繼承」
4:20:43 Python 直譯器
如果您聽完上述影片後覺得不過癮,或者想聽更完整的 Python 程式設計內容,或許可以考慮購買我在 YOTTA 這個平台製作的 Python 課程。網址是:
https://bit.ly/2k0zwCy
裡面包含:
1. 32+ 小時的精采內容!
除了 Python 語法外,還包含「計算機概論」、「Git」、「LINE 聊天機器人」等主題。
2. 26 個與課程內容緊密搭配的課後作業!
讓您學完後馬上練習,我會一題一題仔細地親自批改,徹底變身成為懂程式設計的珍貴人才!
課程目前已經全部製作完畢!600+ 位同學一致五星評價。購買後馬上可以享有完整 32 小時課程內容。
希望各位能夠喜歡今天的分享!在新的一年裡,祝福各位每天工作都順順利利、收獲滿滿!
PS: 本文歡迎轉發、按讚、留言鼓勵我一下!您的隻字片語,都是讓我繼續提供好物的動力喔!
--------
看更多的紀老師,學更多的程式語言:
● YOTTA Python 課程購買: https://bit.ly/2k0zwCy
● Facebook 粉絲頁: https://goo.gl/N1z9JB
● YouTube 頻道: https://goo.gl/pQsdCt
● Instagram 日常生活: https://goo.gl/nBHzXC
● Twitter 碎碎念: https://is.gd/xFZeub
如果您覺得這個粉絲頁不錯,請到「評論區」給我一個好評喔!
https://www.facebook.com/pg/teacherchi/reviews/
python字串轉數字 在 紀老師程式教學網 Facebook 的最讚貼文
[免費教學] 千萬次播放的 Python 初學者影音課程,四個半小時馬拉松連播!
(含簡體中文字幕)
YouTube 網址: https://youtu.be/rfscVS0vtbw
-\-\-\-\-\-\-\-\-\-\-\-\
大家 2020 年新年快樂! :-D
今天要介紹給大家的,是我在 YouTube 上找到的一部四個半小時的影片:「學習 Python - 初學者全教程」。它一口氣把 Python 的基礎語法,在一支影片裡全部講出來!雖然沒有涵蓋到 Python 所有語法,但 80% 的情況也夠用了!希望大家會喜歡!
影片雖然是英文發音,但是已經有熱心人士,翻譯出十種語言的字幕了。其中也包含「簡體中文」。如果您對於直接聽英文沒有信心的話,可以把簡體中文字幕打開,應該能幫助您更好了解影片的內容。
附上該影片內容的時軸索引。如果您有特別想聽的內容,可以直接跳到特定時間點觀看:
0:00 簡介
1:45 環境安裝(IDLE & PyCharm)
6:40 設定&您的第一個程式
10:23 繪製幾何圖形
15:06 變數與資料型態
27:03 如何在 Python 內使用文字
38:18 如何在 Python 內使用數字
48:26 讀取使用者的輸入
52:37 範例:一個簡單的計算機
58:27 範例:填字遊戲
1:03:10 資料結構:串列(Lists)
1:10:44 串列相關函數
1:18:57 資料結構:元組(Tuples)
1:24:15 函數
1:34:11 函數傳回值
1:40:06 分支(if 指令)
1:54:07 分支與比較運算子
2:00:37 範例:改良簡單的計算機
2:07:17 資料結構:字典(Dictionaries)
2:14:13 迴圈(while 指令)
2:20:21 範例:猜字遊戲
2:32:44 迴圈(for 指令)
2:41:20 範例:製作一個指數函數
2:47:13 二維串列與巢狀迴圈
2:52:41 範例:一個簡單的翻譯器
3:00:18 註解(Comments)
3:04:17 例外處理(Try/Except 指令)
3:12:41 讀取檔案內容
3:21:26 寫資料到一個檔案裡
3:28:13 模組製作與安裝
3:43:56 類別與物件
3:57:37 範例:建立一個選擇題測驗
4:08:28 物件相關函數
4:12:37 物件導向的「繼承」
4:20:43 Python 直譯器
如果您聽完上述影片後覺得不過癮,或者想聽更完整的 Python 程式設計內容,或許可以考慮購買我在 YOTTA 這個平台製作的 Python 課程。網址是:
https://bit.ly/2k0zwCy
裡面包含:
1. 32+ 小時的精采內容!
除了 Python 語法外,還包含「計算機概論」、「Git」、「LINE 聊天機器人」等主題。
2. 26 個與課程內容緊密搭配的課後作業!
讓您學完後馬上練習,我會一題一題仔細地親自批改,徹底變身成為懂程式設計的珍貴人才!
課程目前已經全部製作完畢!600+ 位同學一致五星評價。購買後馬上可以享有完整 32 小時課程內容。
希望各位能夠喜歡今天的分享!在新的一年裡,祝福各位每天工作都順順利利、收獲滿滿!
PS: 本文歡迎轉發、按讚、留言鼓勵我一下!您的隻字片語,都是讓我繼續提供好物的動力喔!
-\-\-\-\-\-\-\-\
看更多的紀老師,學更多的程式語言:
● YOTTA Python 課程購買: https://bit.ly/2k0zwCy
● Facebook 粉絲頁: https://goo.gl/N1z9JB
● YouTube 頻道: https://goo.gl/pQsdCt
● Instagram 日常生活: https://goo.gl/nBHzXC
● Twitter 碎碎念: https://is.gd/xFZeub
如果您覺得這個粉絲頁不錯,請到「評論區」給我一個好評喔!
https://www.facebook.com/pg/teacherchi/reviews/
python字串轉數字 在 吳老師教學部落格 Youtube 的最佳解答
Python基礎程式語言應用證照班第8次上課
01_重點回顧與用串列計算成績
02_計算人數總分平均最高低分
03_成績改為外部讀取檔案
04_讀取檔案與切割資料並轉為數字
05_用檔案物件寫出成績報表
06_串接為s1字串變數後再輸出
07_串接重點與讀取會員資料
08_只讀取前十個會員資料
09_只取姓名和手機兩欄
完整教學
http://goo.gl/aQTMFS
吳老師教學論壇
http://www.tqc.idv.tw/
教學論壇(之後課程會放論壇上課學員請自行加入):
https://groups.google.com/g/tcfst_python_2021_2
證照基礎程式語言 (Python 3)證照
Python 第1類:基本程式設計
技能內容:變數與常數、指定敘述、標準輸入輸出、運算式、算術運算子、數學函式的應用、格式化的輸出Python 第2類:選擇敘述
技能內容:if、if...else、if…elifPython 第3類:迴圈敘述
技能內容:while、for…inPython 第4類:進階控制流程
技能內容:常用的控制結構、條件判斷、迴圈Python 第5類:函式(Function)
技能內容:函式使用、傳遞參數、回傳資料、內建函式、區域變數與全域變數
上課用書:
Python 3.x 程式語言特訓教材(第二版)
作者: 蔡明志, 財團法人中華民國電腦技能基金會
出版社:全華
出版日期:2018/12/20
定價:490元
吳老師 110/9/7
EXCEL,VBA,Python,自強工業基金會,EXCEL,VBA,函數,程式設計,線上教學,PYTHON安裝環境
python字串轉數字 在 吳老師教學部落格 Youtube 的最讚貼文
Python基礎程式語言應用證照班第8次上課
01_重點回顧與用串列計算成績
02_計算人數總分平均最高低分
03_成績改為外部讀取檔案
04_讀取檔案與切割資料並轉為數字
05_用檔案物件寫出成績報表
06_串接為s1字串變數後再輸出
07_串接重點與讀取會員資料
08_只讀取前十個會員資料
09_只取姓名和手機兩欄
完整教學
http://goo.gl/aQTMFS
吳老師教學論壇
http://www.tqc.idv.tw/
教學論壇(之後課程會放論壇上課學員請自行加入):
https://groups.google.com/g/tcfst_python_2021_2
證照基礎程式語言 (Python 3)證照
Python 第1類:基本程式設計
技能內容:變數與常數、指定敘述、標準輸入輸出、運算式、算術運算子、數學函式的應用、格式化的輸出Python 第2類:選擇敘述
技能內容:if、if...else、if…elifPython 第3類:迴圈敘述
技能內容:while、for…inPython 第4類:進階控制流程
技能內容:常用的控制結構、條件判斷、迴圈Python 第5類:函式(Function)
技能內容:函式使用、傳遞參數、回傳資料、內建函式、區域變數與全域變數
上課用書:
Python 3.x 程式語言特訓教材(第二版)
作者: 蔡明志, 財團法人中華民國電腦技能基金會
出版社:全華
出版日期:2018/12/20
定價:490元
吳老師 110/9/7
EXCEL,VBA,Python,自強工業基金會,EXCEL,VBA,函數,程式設計,線上教學,PYTHON安裝環境
python字串轉數字 在 吳老師教學部落格 Youtube 的精選貼文
Python基礎程式語言應用證照班第8次上課
01_重點回顧與用串列計算成績
02_計算人數總分平均最高低分
03_成績改為外部讀取檔案
04_讀取檔案與切割資料並轉為數字
05_用檔案物件寫出成績報表
06_串接為s1字串變數後再輸出
07_串接重點與讀取會員資料
08_只讀取前十個會員資料
09_只取姓名和手機兩欄
完整教學
http://goo.gl/aQTMFS
吳老師教學論壇
http://www.tqc.idv.tw/
教學論壇(之後課程會放論壇上課學員請自行加入):
https://groups.google.com/g/tcfst_python_2021_2
證照基礎程式語言 (Python 3)證照
Python 第1類:基本程式設計
技能內容:變數與常數、指定敘述、標準輸入輸出、運算式、算術運算子、數學函式的應用、格式化的輸出Python 第2類:選擇敘述
技能內容:if、if...else、if…elifPython 第3類:迴圈敘述
技能內容:while、for…inPython 第4類:進階控制流程
技能內容:常用的控制結構、條件判斷、迴圈Python 第5類:函式(Function)
技能內容:函式使用、傳遞參數、回傳資料、內建函式、區域變數與全域變數
上課用書:
Python 3.x 程式語言特訓教材(第二版)
作者: 蔡明志, 財團法人中華民國電腦技能基金會
出版社:全華
出版日期:2018/12/20
定價:490元
吳老師 110/9/7
EXCEL,VBA,Python,自強工業基金會,EXCEL,VBA,函數,程式設計,線上教學,PYTHON安裝環境
python字串轉數字 在 Python hex string to int 16進位字串轉數字 的推薦與評價
本篇介紹Python hex string to int 16進位字串轉數字,Python 沒有所謂的hex 的變數型態,所以16 進位都是要轉換到int 去作運算,之後要顯示成16 進位 ... ... <看更多>
python字串轉數字 在 Re: [問題] pandas.to_csv 字串型態的數字- 看板Python - 批踢踢 ... 的推薦與評價
※ 引述《nepholi (我不是砲哥)》之銘言:
: Hi all,
: 小弟剛接觸Py沒多久
: 經歷只有用google大神邊查邊學基本語法
: 然後只拚出一套暴力型爬蟲
: 所以可能有些東西不知道怎麼查或找錯方向再請各位指教
: 這次要處理一筆資料是excel檔要轉成csv給後續一支正常運作中的C++讀取
: 其中excel的內容為 (以下為虛構)
: 部門 | 卡號 | 名字 | 時間 |
: ABC | 00010 | John | 2019/12/25 08:00:01 |
: ABC | 00011 | Tom | 2019/12/25 08:02:55 |
: ..以此類推
: 用最直接的寫法
: df = pd.read_excel('test.xlsx', usecols="A:D", dtype={'卡號':str})
: 可以成功讀進我想要的資料及型態
: 1.卡號為str (為了保留完整五位數)
: 2.日期為datatime
: 然後
: df.to_csv('hello.csv', index=None, header=True, encoding='utf-8-sig',
: quoting=csv.QUOTE_NONNUMERIC)
: 這句跑完之後產出的csv其中卡號跟日期欄位卻不是我想要的5位數及顯示秒數
: 而是
: 部門 | 卡號 | 名字 | 時間 |
: ABC | 10 | John | 2019/12/25 08:00 |
: ABC | 11 | Tom | 2019/12/25 08:02 |
: 我有想過是不是csv的儲存格格式造成
: 日期的部分證實的確是
: 但卡號的部分被預設為"通用格式"導致我的卡號被去掉了前置0
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
據我所知,如果你在使用 pandas 讀入檔案的時候已經有使用 dtype,
或者在後續操作 dataframe 時,有透過 astype 將資料表內容轉為字串格式的話。
那麼在最後使用 to_csv() 轉換成 csv 格式的純文字檔是不會格式跑掉的。
由於你提到了「通用格式」,那麼最有可能造成被截去前方零位的原因,
是使用了 Excel, Numbers 或是 LibreOffice 這類試算表軟體去打開 csv 檔
如果你沒有特別規定讀入時要進行的格式操作,
這些軟體通常會自作聰明地替你處理。
---
關於 csv 檔,我們可以看一下 Wiki 上面的說明:
逗號分隔值 (CSV, Comma-Separated Values),其檔案以純文字形式儲存表格資
料(數字和文字)。純文字意味著該檔案是一個字元序列,不含必須像二進位數字
那樣被解讀的資料。
因為通常可以用表格形式表現,所以可以用試算表軟體打開,但是本質是純文字
。建議使用純文字的編輯器,比如:記事本、notepad++、Sublime Text 或者是
VS Code 去開,看看這些數值是不是帶有 leading zero,如果有的話就不用管
他了,你轉換的檔案是正確的,只是試算表自己自作聰明而已,對於後續用 C++
操作是不會有影響的。
至於日期的部份,你也可以同樣在讀入時存成字串就不會有這個問題了。
: 不曉得有沒有辦法可以在python的code裡面去設定這個呢
: 我找了pandas的官網說明to_csv但無斬獲
: 不知道是不是我誤會或漏看了..
: 感謝XD
: P.S. 因為C++裡面讀取卡號後並沒有預設要做補0的動作
: 所以希望能在py這部分就處理掉
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.247.1 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1577247803.A.76C.html
這好像跟我的理解有所不同,如果是浮點數的話,會取到小數點後的最大有效值
,比如說:
1.903900 -> 1.9049
2.410000 -> 2.41
3.541130 -> 3.54113
如果是整數的話,出來應該依然還是整數而不會被轉換。另一個可能的狀況是由
於有 NaN 的存在所進行的型態轉換:
https://bit.ly/2Qev3Iy
> In the absence of high performance NA support being built into NumPy
> from the ground up, the primary casualty is the ability to represen
> NAs in integer arrays.
>
> This trade-off is made largely for memory and performance reasons,
> and also so that the resulting Series continues to be “numeric”.
>
> If you need to represent integers with possibly missing values, use
> one of the nullable-integer extension dtypes provided by pandas:
>
> Int8Dtype, Int16Dtype, Int32Dtype, Int64Dtype
轉字串應該會比較快一點...
試算表工具可以拿來開啟 csv 檔案,但 csv 檔案並不具備試算表的詳細格式,
這是很多人常常會搞不清楚的,要用試算表開啟 csv 檔案,建議使用匯入的方
式而非直接開啟,除此之外建議保存時另存新檔。
甚至我之前也有遇過 Excel 匯入 csv 之後,他的 parser 抓錯沒有成功匯入的
狀況。
※ 編輯: Hsins (140.112.247.1 臺灣), 12/25/2019 18:26:21
... <看更多>