整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          PyScript:讓 Python 腳本在 Web 中跑起來

          是下一個大事件嗎?如果繼續發展下去,有可能。


          在 2022 年 PyCon 美國大會期間,作為主題演講嘉賓之一的 Peter Wang 公布了 PyScript,一種在 HTML 中直接編寫 Python 腳本的方法。或許你不知道 Peter,但你可能聽說過 Anaconda,這是一種流行的開源的 Python 和 R 語言的發行版本,特別關注數據科學。Peter 正是 Anaconda 的 CEO 和聯合創始人。


          換言之,PyScript 是由一家著名的科技公司開發的,這可能會保證它在不久的將來成為可行的方案。它在 Python 和 Web 開發者中受到了極大的關注,GitHub 上已有超過 10k 顆 Stars。然而,它是否能成為一個成功的、有競爭力的產品,取決于長期的時間和開發投入。目前,它還有一些已知的缺陷(將在最后討論)。


          閑話少說,讓我們快速了解一下這個令人振奮的產品吧!

          py-script 標簽

          我們知道,HTML 文件是大多數網站最常見的元素。在創建網站時,我們的工作就是直接或間接地通過一些框架來編制 HTML 文件。在典型的 HTML 文件中,你會看到各種類型的標簽。例如,<head>定義了 HTML 頁面的元數據和關鍵信息,<title>是整個文檔的標題,而<h1><h2>等定義了不同級別的內容標題。


          如前所述,PyScript 允許你在 HTML 中編寫 Python 腳本,它使用一個特殊的標簽py-script。在這個標簽中,你可以嵌入 Python 腳本。要了解它是如何工作的,可以創建一個 HTML 文件,其中包含以下代碼,并使用 Chrome 瀏覽器打開該文件。在 Chrome 瀏覽器中,你應該能夠看到類似下面這樣的內容:



          作者截圖


          在上面的代碼片段中,你可能已經注意到以下三個關鍵點:

          • link標簽定義了一個外部樣式表。在這個例子中,我們使用了 PyScript 提供的css文件。
          • 我們使用script標簽來嵌入一個由src定義、由 PyScript 托管的外部腳本。我們使用了defer,這樣腳本會在下載和頁面解析完成后執行——本質上是一種延遲執行,而不是實時執行。
          • 最有趣的部分是py-script標簽。如你所見,print("Hello, World!")是 Python 代碼。當執行 HTML 文件時,就可以看到代碼求值結果。


          這很酷,不是嗎?如果你不熟悉 Web 開發,但了解 Python,就可以使用 PyScript 嵌入任何有效的 Python 代碼。讓我們再看一個例子。



          另一個 PyScript 示例(圖片由作者提供)


          在這里,我們寫了一些需要計算的代碼,可以看到,腳本得到了正確的執行。

          py-env 標簽

          在編寫更復雜的代碼時,就需要使用第三方庫。在這種情況下,我們可以利用py-env標簽。你可能已經猜到的,env 是 environment 的縮寫。py-env標簽中列出了運行代碼所需的 Python 包。


          你可能知道,許多數據科學家都使用 pandas 進行數據處理工作。讓我們看看下面的例子。



          使用包的 PyScript(圖片由作者提供)


          如你所見,我們在py-env標簽中指定了依賴項(即 Pandas),該標簽包含在head標簽中。如果頁面需要多個依賴項,可以在這里把它們全部列出:


          <py-env>
            - pandas
            - matplotlib
            - numpy
          </py-env>

          復制代碼

          如你所見,在py-script標簽中,我們確實可以使用 Pandas 庫來創建一個DataFrame對象。然而,當我們把打印出來時就會發現,它是一個單行,而不是一個結構化的數據表。沒有一個適當的結構,我們就無法理解這些數據。幸運的是,我們可以使用write函數(下文會討論)。

          將內容寫入指定標簽

          除了 Python 中的標準打印函數print,作為腳本的一部分,PyScript 有自己的write函數,可以將數據發送到頁面上指定的 Web 元素中。請看下面的例子:



          PyScript 寫函數 write(圖片由作者提供)


          與之前的例子相比,上述代碼片段有兩個重大變化:

          • 我們現在定義了一個 id 為"DataFrame"div,這樣稍后就可以引用。
          • py-script標簽中,我們創建一個與之前相同的DataFrame對象。但現在,我們不是調用print,而是調用pyscript.write函數,請求 PyScript 處理并在"DataFrame"中顯示DataFrame對象。從輸出可以看到,我們現在有一個結構化的表格了。


          write函數不僅能夠打印表格,還能夠打印數字。下面的例子向你展示了我們如何使用matplotlib(一個流行的 Python 包,用于數據可視化)來顯示由 Python 創建的圖。



          PyScript 打印圖(圖片由作者提供)


          如你所見,write 函數以期望的方式顯示了圖。

          py-repl 標簽


          Python 學習的最好方法之一是使用 REPL:讀取(Read)、求值(Evaluate)、打印(Print)和循環(Loop)。也就是說,使用一個交互式的 Python 控制臺,輸入一些代碼,Python 對其進行求值并打印適當的輸出,然后重復這個過程。Web 頁面也可以提供這樣的 REPL 環境,比如 Jupyter Notebook。


          PyScript 可以使用py-repl標簽提供與此類似的東西。在這個元素中,你可以讓用戶自己編寫代碼,也可以以編程方式輸入代碼。請看下面的例子:



          PyScript REPL(圖片由作者提供)


          如你所見,上圖中有一個單元格,其中包括在py-repl標簽中指定的代碼。值得注意的是,單元格中的代碼可以引用我們之前在py-script標簽中定義的變量。一切看起來都很協調。

          感想


          本文介紹的內容是現階段 PyScript 所能提供的主要亮點。它似乎是一個很有前途的產品,因為它提供了一個靈活的框架,讓 Python 程序員可以在沒有太多 Web 開發知識的情況下創建 Web 應用。然而,也有其他類似的成功的產品,因此,競爭會很激烈。


          例如,如果我需要為自己的數據科學項目創建一個 Web 應用,我就會直接使用 Streamlit。它的功能已經相對成熟。請注意,雖然都與 Web 開發有關,但 PyScript 和 Streamlit 屬于不同的產品系。PyScript 應該更通用,因為它的目標是讓你可以在任何網頁上嵌入任何 Python 代碼,Streamlit 做不到這一點。


          在 PyScript 為更多的人所接受之前,它有幾個問題必須解決。例如,Web 頁面的加載速度非常慢。如果你嘗試跟隨本教程運行代碼,可能就會注意到,在 Web 頁面的顯示會有一個明顯的滯后。


          盡管如此,我還是覺得這個產品會繼續發展,我的信心主要來自于它的開發者——給我們帶來極好的 Anaconda 工具的 Anaconda 團隊。


          本文最初發布于 Better Programming。


          查看英文原文:Running Python Scripts on the Web Using PyScript

          了解更多軟件開發與相關領域知識,點擊訪問 InfoQ 官網:https://www.infoq.cn/,獲取更多精彩內容!

          者:劉早起

          來源:早起Python

          如何在線執行 pandas 代碼感興趣,今天就簡單來說一下我探索這一功能的過程。

          首先在設計這一功能時,需要先明確大致需求:

          • ???用戶可以在當前頁面執行
          • 不同用戶之間獨立運行
          • 不需要加載額外代碼或操作

          其中最重要的一點就是用戶可以在當前網站、當前單元格執行代碼,其次盡可能的減少其他操作。

          其實為了實現這個功能,我探索了大半個月,不斷修改方案,刪掉了幾個寫了很久但是不能完美實現的代碼,幾度放棄,最后還是磕磕碰碰的做出來,下面是我的一些經驗,僅供參考。

          方案1

          首先最簡單的思路就是用自己的服務器,前端寫一個輸入框,然后將用戶提交的代碼到后臺,執行后再返回前端,就像這樣

          但是思索了一番還是放棄了,除了要防止惡意用戶執行sudo rm - rf /*之類的代碼,為了滿足第二個需求就要給每個用戶分配一定的空間,這就很吃服務器的配置,例如前天最高100+用戶同時運行,我的 4c8g 服務器肯定是帶不動的。

          并且如果采取這個的方案,理論上可以實現,但除了升級服務器要錢,我也沒有開發類似產品的經驗,時間成本不好預估,遂放棄。

          方案2

          之后又是一番面向 stackoverflow 編程,我了解到很多可以在線執行代碼的網站,就像這樣

          確實可以在線執行一段代碼,但是除去我是否能做出來,如何控制權限等問題,這樣的網站主要是以執行代碼為主,無法完成 pandas 教程的任務。

          并且代碼不能預設置,只能進入頁面后手動輸入,本地數據也不好加載,而且執行一次就要跳轉到一個新的頁面,十分繁瑣(寫一個爬蟲接口也是一個辦法,但是就太依賴對方網站),于是很快放棄了這條思路。

          Jupyterhub

          繼續一番搜索后,我發現了一個神器 —— Jupyterhub

          如上圖架構展示的一樣,使用Jupyterhub 可以給每個用戶分配一個獨立的Jupyter Notebook,并且無需考慮權限等問題,我也可以提前將代碼和數據進行預設。

          但問題在于采取此方案無法滿足教程需求,因為全部內容都需要放在 Jupyter Notebook中,整體上就是將 pandas300題做成了在線版,而我想要的是一個網站

          并且使用Jupyterhub不可避免的要進行一些 dockerk8s 操作,這也不是我熟悉的領域,雖熱在這條思路上走了一段時間,但還是放棄了。

          JupyterBook

          之后又是一番檢索,但無非都是上面幾種方案,在我感覺要放棄做這個網站時,無意中發現一個項目JupyterBook

          簡單來說,他可以將你的 Jupyter Notebook 轉換為 html 頁面(基于 sphinx),并且一個很重要的特點就是可以在線、交互式執行代碼。

          具體怎么實現的呢?首先需要將你的項目上傳到一個公共資源平臺binder,這個網站會為你的項目創建一個鏡像,這樣可以方便給不同用戶使用

          簡單來說,可以理解為將你的 Jupyter Notebook 掛在這個網站,別人就能去在線執行,但是很明顯,我們都需要跳轉到這個頁面去使用,而我希望在當前頁面執行代碼。

          這時就需要在使用另一個項目(Thebe

          它使用JupyterLab API,通過加載一段JS代碼,再指定一個執行后端(上面提到的binder),就可以在當前頁面執行代碼。

          聽起來很復雜,但是實現起來很簡單,上面我們說到,JupyterBook 是基于 Sphinx制作頁面的,所以只需要提前在配置 Sphinx時加載 sphinx_thebe插件即可,

          至此,開頭我需求中的1、2就完美實現了,還剩最后一個問題就是如何讓用戶更少的執行代碼?

          如果你體驗過我的網站,你會發現執行一個 pandas 操作連 import pandas as pd和讀取數據的操作都不用!

          其實這些代碼在啟動jupyter notebook時就預先加載了,只需要在對應單元格上加上 thebe-init的 tag 即可。

          當然,使用 JupyterBook 還是有很多坑,消耗我最多的時間就是在修改樣式上,默認的樣式如下,可能英文狀態下表現還行,但是到中文并不是很適配

          為了大家不僅用的爽,我對網站顏值的要求也很高,于是爆改了幾千行的 cssjs 代碼,甚至組件的位置都調整到小數點后兩位才讓我滿意,磕磕碰碰一個多月終于將整個網站做出來

          最后,本文僅是對在線執行代碼做了一個快速、不完整的總結。由于篇幅限制,還有很多搭建、部署網站細節的內容沒有涉及到,如果你覺得不錯,歡迎點贊、轉發。

          器之心報道

          項目作者:vinayak mehta參與:一鳴

          從 PDF 表格中獲取數據是一項痛苦的工作。不久前,一位開發者提供了一個名為 Camelot 的工具,使用三行代碼就能從 PDF 文件中提取表格數據。

          PDF 文件是一種非常常用的文件格式,通常用于正式的電子版文件。它能夠很好的將不同的排版格式固定下來,形成版面清晰且美觀的展示效果。然而,對于想要從 PDF 中提取信息的人們來說,PDF 是個噩夢,尤其是表格。

          大量的學術報告、論文、分析文章都使用 PDF 展示其中的表格數據,但是對于如果想要直接從表格中復制數據則會非常麻煩。不久前,有一位開發者提供了一個可從文字 PDF 中提取表格信息的工具——Camelot,能夠直接將大部分表格轉換為 Pandas 的 Dataframe。

          • 項目地址:https://github.com/camelot-dev/camelot

          Camelot 是什么

          據項目介紹稱,Camelot 是一個 Python 工具,用于將 PDF 文件中的表格數據提取出來。

          具體而言,用戶可以像使用 Pandas 那樣打開 PDF 文件,然后利用這個工具提取表格數據,最后再指定輸出的形式(如 csv 文件)。

          代碼示例

          項目提供的 PDF 文件如圖所示,假設用戶需要提取這些文字之間的表格 2-1 中的信息。

          PDF 文件。我們需要提取表格 2-1。

          使用 Camelot 提取表格數據的代碼如下:

          >>> import camelot
          >>> tables = camelot.read_pdf('foo.pdf') #類似于Pandas打開CSV文件的形式
          >>> tables[0].df # get a pandas DataFrame!
          >>> tables.export('foo.csv', f='csv', compress=True) # json, excel, html, sqlite,可指定輸出格式
          >>> tables[0].to_csv('foo.csv') # to_json, to_excel, to_html, to_sqlite, 導出數據為文件
          >>> tables
          <TableList n=1>
          >>> tables[0]
          <Table shape=(7, 7)> # 獲得輸出的格式
          >>> tables[0].parsing_report
          {
           'accuracy': 99.02,
           'whitespace': 12.24,
           'order': 1,
           'page': 1
          }
          

          以下為輸出的結果,對于合并的單元格,Camelot 在抽取后做了空行處理,這是一個穩妥的方法。

          安裝方法

          項目作者提供了三種安裝方法。首先,你可以使用 Conda 進行安裝,這是最簡單的。

          conda install -c conda-forge camelot-py
          

          最流行的安裝方法是使用 pip 安裝。

          pip install camelot-py[cv]
          

          還可以從項目中克隆代碼,并使用源碼安裝。


          主站蜘蛛池模板: 另类ts人妖一区二区三区| 免费一区二区无码东京热| 中文字幕在线观看一区二区| 少妇精品久久久一区二区三区| 日本人的色道www免费一区| 中文字幕一区一区三区| 又硬又粗又大一区二区三区视频 | 日韩爆乳一区二区无码| 久久精品人妻一区二区三区| 国产麻豆剧果冻传媒一区| 色一情一乱一伦一区二区三欧美 | 99精品一区二区三区| 中文字幕日韩人妻不卡一区| 国产91精品一区| 国内精品一区二区三区在线观看| 亚洲午夜电影一区二区三区| 国产精品亚洲一区二区三区在线| 无码毛片一区二区三区视频免费播放 | 日日摸夜夜添一区| 中文字幕日韩一区| 国产精品福利一区二区| 51视频国产精品一区二区| 国产电影一区二区| 国产日本亚洲一区二区三区| 日本视频一区在线观看免费| 3D动漫精品啪啪一区二区下载| 日本免费一区二区三区四区五六区 | 精品亚洲一区二区| 亚洲一区综合在线播放| 国产99久久精品一区二区| 亚洲AV无码一区二区三区性色| 中文字幕av日韩精品一区二区| 2018高清国产一区二区三区| 成人毛片一区二区| 一区二区在线视频观看| 熟妇人妻系列av无码一区二区| 亚洲AV无一区二区三区久久| 精品无码av一区二区三区| 老熟妇高潮一区二区三区| 波多野结衣一区二区三区88| 中文无码AV一区二区三区|