整合營銷服務商

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

          免費咨詢熱線:

          Python3表格數據處理

          Python3表格數據處理

          • 技術背景
          • python對Excel表格的處理
          • vaex的安裝與使用
            • vaex的安裝
            • 性能對比
            • 數據格式轉換
          • 總結概要
          • 版權聲明
          • 參考鏈接

          技術背景

          數據處理是一個當下非常熱門的研究方向,通過對于大型實際場景中的數據進行建模,可以用于預測下一階段可能出現的情況。比如我們有過去的2002年-2018年的黃金價格的數據:


          該數據來源于Gitee上的一個開源項目。其中包含有:時間、開盤價、收盤價、最高價、最低價、交易數以及成交額這么幾個參數。假如我們使用一個機器學習的模型去分析這個數據,也許我們可以預測在這個數據中并不存在的金價數據。如果預測的契合度較好,那么對于一些人的投資策略來說有重大意義。但是這種實際場景下的數據,往往數據量是非常大的。雖然這里我們使用到的數據只有300多KB,但是我們更多的時候不得不考慮10個GB甚至是1個TB以上的數據的處理。如果處理都無法處理,那我們如何對這些數據進行建模呢?

          python對Excel表格的處理

          首先我們看一個最簡單的情況,我們先不考慮性能的問題,那么我們可以使用xlrd這個工具來在python中打開和加載一個Excel表格:

          # table.py
          
          def read_table_by_xlrd():
              import xlrd
              workbook=xlrd.open_workbook(r'data.xls')
              sheet_name=workbook.sheet_names()
              print ('All sheets in the file data.xls are: {}'.format(sheet_name))
              sheet=workbook.sheet_by_index(0)
              print ('The cell value of row index 0 and col index 1 is: {}'.format(sheet.cell_value(0, 1)))
              print ('The elements of row index 0 are: {}'.format(sheet.row_values(0)))
              print ('The length of col index 1 are: {}'.format(len(sheet.col_values(1))))
          
          if __name__=='__main__':
              read_table_by_xlrd()

          上述代碼的輸出如下:

          [dechin@dechin-manjaro gold]$ python3 table.py 
          All sheets in the file data.xls are: ['Sheet1', 'Sheet2', 'Sheet3']
          The cell value of row index 0 and col index 1 is: 開
          The elements of row index 0 are: ['時間', '開', '高', '低', '收', '量', '額']
          The length of col index 1 are: 3923

          我們這里成功地將一個xls格式的表格加載到了python的內存中,我們可以對這些數據進行分析。如果需要對這些數據修改,可以使用openpyxl這個倉庫,但是這里我們不做過多的贅述。

          在python中還有另外一個非常常用且非常強大的庫可以用來處理表格數據,那就是pandas,這里我們利用ipython這個工具簡單展示一下使用pandas處理表格數據的方法:

          [dechin@dechin-manjaro gold]$ ipython
          Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
          Type 'copyright', 'credits' or 'license' for more information
          IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.
          
          In [1]: import pandas as pd
          
          In [2]: !ls -l
          總用量 368
          -rw-r--r-- 1 dechin dechin 372736  3月 27 21:31 data.xls
          -rw-r--r-- 1 dechin dechin    563  3月 27 21:42 table.py
          
          In [3]: data=pd.read_excel('data.xls', 'Sheet1') # 讀取excel格式的文件
          
          In [4]: data.to_csv('data.csv', encoding='utf-8') # 轉成csv格式的文件
          
          In [7]: !ls -l
          總用量 588
          -rw-r--r-- 1 dechin dechin 221872  3月 27 21:52 data.csv
          -rw-r--r-- 1 dechin dechin 372736  3月 27 21:31 data.xls
          -rw-r--r-- 1 dechin dechin    563  3月 27 21:42 table.py
          
          In [8]: !head -n 10 data.csv # 讀取csv文件的頭10行
          ,時間,開,高,低,收,量,額
          0,2002-10-30,83.98,92.38,82.0,83.52,352,29373370
          1,2002-10-31,83.9,83.92,83.9,83.91,66,5537480
          2,2002-11-01,84.5,84.65,84.0,84.51,77,6502510
          3,2002-11-04,84.9,85.06,84.9,84.99,95,8076330
          4,2002-11-05,85.1,85.2,85.1,85.13,61,5193650
          5,2002-11-06,84.9,84.9,84.9,84.9,1,84900
          6,2002-11-07,85.0,85.15,85.0,85.14,26,2212310
          7,2002-11-08,85.25,85.28,85.1,85.16,35,2981780
          8,2002-11-11,85.18,85.19,85.18,85.19,65,5537050

          在ipython中我們不僅可以執行python指令,還可以在前面加一個!就能夠執行一些系統命令,非常的方便。csv格式的文件,其實就是用逗號跟換行符來替代常用的\t字符串進行數據的分隔。

          但是,不論是使用xlrd還是pandas,我們都會面臨一個同樣的問題:需要把所有的數據加載到內存中進行處理。我們一般的個人電腦只有8GB-16GB的內存,就算是比較大的64GB的內存,我們也只能夠在內存中對64GB以下內存大小的文件進行處理,這對于大數據場景來說遠遠不夠。所以,下一章節中介紹的vaex就是一個很好的解決方案。另外,關于Linux下查看本地內存以及使用情況的方法如下:

          [dechin@dechin-manjaro gold]$ vmstat
          procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
           r  b 交換 空閑 緩沖 緩存   si   so    bi    bo   in   cs us sy id wa st
           0  0      0 35812168 328340 2904872    0    0    20    27  362  365  8  4 88  0  0
          [dechin@dechin-manjaro gold]$ vmstat 2 3
          procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
           r  b 交換 空閑 緩沖 緩存   si   so    bi    bo   in   cs us sy id wa st
           1  0      0 35810916 328356 2905844    0    0    20    27  362  365  8  4 88  0  0
           0  0      0 35811916 328364 2904952    0    0     0     6  613  688  1  1 99  0  0
           0  0      0 35812168 328364 2904856    0    0     0     0  672  642  0  1 99  0  0

          我們可以看到空閑內存大約有36GB的內存,這里我們本機一共有40GB的內存,算是比較大的了。

          vaex的安裝與使用

          vaex提供了一種內存映射的數據處理方案,我們不需要將整個的數據文件加載到內存中進行處理,我們可以直接對硬盤存儲進行操作。換句話說,我們所能夠處理的文件大小不再受到內存大小的限制,只要在磁盤存儲空間允許的范圍內,我們都可以對這么大小的文件進行處理。
          一般現在個人PC的磁盤最小也有128GB,遠遠大于內存可以承受的范圍。當然,由于分區的不同,不一定能夠保障所有的內存資源都能夠被使用到,這里附上查看當前目錄分區的可用磁盤空間大小查詢的方法:

          [dechin@dechin-manjaro gold]$ df -hl .
          文件系統        容量  已用  可用 已用% 掛載點
          /dev/nvme0n1p9  144G   57G   80G   42% /

          這里可以看到我們還有80GB的可用磁盤空間,也就是說,如果我們在當前目錄放一個80GB大小的表格文件,那么用pandas和xlrd都是沒辦法處理的,因為這已經遠遠超出了內存可支持的空間。但是用vaex,我們依然可以對這個文件進行處理。

          在vaex的官方文檔鏈接中也介紹有vaex的原理和優勢:

          vaex的安裝

          與大多數的python第三方包類似的,我們可以使用pip來進行下載和管理。當然由于下載的文件會比較多,中間的過程也會較為緩慢,我們只需安靜等待即可:

          [dechin@dechin-manjaro gold]$ python3 -m pip install vaex
          Collecting vaex
            Downloading vaex-4.1.0-py3-none-any.whl (4.5 kB)
          Collecting vaex-ml<0.12,>=0.11.0
            Downloading vaex_ml-0.11.1-py3-none-any.whl (95 kB)
               |████████████████████████████████| 95 kB 81 kB/s 
          Collecting vaex-core<5,>=4.1.0
            Downloading vaex_core-4.1.0-cp38-cp38-manylinux2010_x86_64.whl (2.5 MB)
               |████████████████████████████████| 2.5 MB 61 kB/s 
            Downloading ipywidgets-7.6.3-py2.py3-none-any.whl (121 kB)
               |████████████████████████████████| 121 kB 175 kB/s 
          Requirement already satisfied: ipykernel>=4.7 in /home/dechin/anaconda3/lib/python3.8/site-packages (from ipympl->vaex-jupyter<0.7,>=0.6.0->vaex) (5.3.4)
          Collecting branca<0.5,>=0.3.1
            Downloading branca-0.4.2-py3-none-any.whl (24 kB)
          Collecting shapely
            Downloading Shapely-1.7.1-cp38-cp38-manylinux1_x86_64.whl (1.0 MB)
               |████████████████████████████████| 1.0 MB 98 kB/s 
          Collecting traittypes<3,>=0.2.1
            Downloading traittypes-0.2.1-py2.py3-none-any.whl (8.6 kB)
          Collecting ipyvue<2,>=1.5
            Downloading ipyvue-1.5.0-py2.py3-none-any.whl (2.7 MB)
               |████████████████████████████████| 2.7 MB 80 kB/s 
          Collecting ipywebrtc
            Downloading ipywebrtc-0.5.0-py2.py3-none-any.whl (1.1 MB)
               |████████████████████████████████| 1.1 MB 99 kB/s 
          Collecting pythreejs>=1.0.0
            Downloading pythreejs-2.3.0-py2.py3-none-any.whl (3.4 MB)
               |████████████████████████████████| 3.4 MB 30 kB/s 
          Requirement already satisfied: widgetsnbextension~=3.5.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from ipywidgets>=7.6.0->ipympl->vaex-jupyter<0.7,>=0.6.0->vaex) (3.5.1)
          Requirement already satisfied: nbformat>=4.2.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from ipywidgets>=7.6.0->ipympl->vaex-jupyter<0.7,>=0.6.0->vaex) (5.0.8)
          Requirement already satisfied: ipython>=4.0.0; python_version >="3.3" in /home/dechin/anaconda3/lib/python3.8/site-packages (from ipywidgets>=7.6.0->ipympl->vaex-jupyter<0.7,>=0.6.0->vaex) (7.19.0)
          Collecting jupyterlab-widgets>=1.0.0; python_version >="3.6"
            Downloading jupyterlab_widgets-1.0.0-py3-none-any.whl (243 kB)
               |████████████████████████████████| 243 kB 115 kB/s 
            Created wheel for aplus: filename=aplus-0.11.0-py3-none-any.whl size=4412 sha256=9762d51c5ece813b0c5a27ff6ebc1a86e709d55edb7003dcc11272c954dd39c7
            Stored in directory: /home/dechin/.cache/pip/wheels/de/93/23/3db69e1003030a764c9827dc02137119ec5e6e439afd64eebb
          Successfully built frozendict aplus
          Installing collected packages: pyarrow, tabulate, frozendict, aplus, python-utils, progressbar2, vaex-core, vaex-ml, vaex-viz, vaex-astro, vaex-hdf5, cachetools, vaex-server, xarray, jupyterlab-widgets, ipywidgets, ipympl, branca, shapely, traittypes, ipyleaflet, ipyvue, ipyvuetify, ipywebrtc, ipydatawidgets, pythreejs, ipyvolume, bqplot, vaex-jupyter, vaex
            Attempting uninstall: ipywidgets
              Found existing installation: ipywidgets 7.5.1
              Uninstalling ipywidgets-7.5.1:
                Successfully uninstalled ipywidgets-7.5.1
          Successfully installed aplus-0.11.0 bqplot-0.12.23 branca-0.4.2 cachetools-4.2.1 frozendict-1.2 ipydatawidgets-4.2.0 ipyleaflet-0.13.6 ipympl-0.7.0 ipyvolume-0.5.2 ipyvue-1.5.0 ipyvuetify-1.6.2 ipywebrtc-0.5.0 ipywidgets-7.6.3 jupyterlab-widgets-1.0.0 progressbar2-3.53.1 pyarrow-3.0.0 python-utils-2.5.6 pythreejs-2.3.0 shapely-1.7.1 tabulate-0.8.9 traittypes-0.2.1 vaex-4.1.0 vaex-astro-0.8.0 vaex-core-4.1.0 vaex-hdf5-0.7.0 vaex-jupyter-0.6.0 vaex-ml-0.11.1 vaex-server-0.4.0 vaex-viz-0.5.0 xarray-0.17.0

          在出現Successfully installed的字樣之后,就代表我們已經安裝成功,可以開始使用了。

          性能對比

          由于使用其他的工具我們也可以正常的打開和讀取表格文件,為了體現出使用vaex的優勢,這里我們直接用ipython來對比一下兩者的打開時間:

          [dechin@dechin-manjaro gold]$ ipython
          Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
          Type 'copyright', 'credits' or 'license' for more information
          IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.
          
          In [1]: import vaex
          
          In [2]: import xlrd
          
          In [3]: %timeit xlrd.open_workbook(r'data.xls')
          46.4 ms ± 76.2 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
          
          In [4]: %timeit vaex.open('data.csv')
          4.95 ms ± 48.5 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
          
          In [7]: %timeit vaex.open('data.hdf5')
          1.34 ms ± 1.84 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

          我們從結果中發現,打開同樣的一份文件,使用xlrd需要將近50ms的時間,而vaex最低只需要1ms的時間,如此巨大的性能優勢使得我們不得不對vaex給予更多的關注。關于跟其他庫的對比,在這個鏈接中已經有人做過了,即使是對比pandas,vaex在讀取速度上也有1000多倍的加速,而計算速度的加速效果在數倍,總體來說表現非常的優秀。

          數據格式轉換

          在上一章節的測試中,我們用到了1個沒有提到過的文件:data.hdf5,這個文件其實是從data.csv轉換而來的。這一章節我們主要就介紹如何將數據格式進行轉換,以適配vaex可以打開和識別的格式。第一個方案是使用pandas將csv格式的文件直接轉換為hdf5格式,操作類似于在python對表格數據處理的章節中將xls格式的文件轉換成csv格式:

          [dechin@dechin-manjaro gold]$ ipython
          Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
          Type 'copyright', 'credits' or 'license' for more information
          IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.
          
          In [1]: import pandas as pd
          
          In [4]: data=pd.read_csv('data.csv')
          
          In [10]: data.to_hdf('data.hdf5','data',mode='w',format='table')
          
          In [11]: !ls -l
          總用量 932
          -rw-r--r-- 1 dechin dechin 221872  3月 27 21:52 data.csv
          -rw-r--r-- 1 dechin dechin 348524  3月 27 22:17 data.hdf5
          -rw-r--r-- 1 dechin dechin 372736  3月 27 21:31 data.xls
          -rw-r--r-- 1 dechin dechin    563  3月 27 21:42 table.py

          操作完成之后在當前目錄下生成了一個hdf5文件。但是這種操作方式有個弊端,就是生成的hdf5文件跟vaex不是直接適配的關系,如果直接用df=vaex.open('data.hdf5')的方法進行讀取的話,輸出內容如下所示:

          In [3]: df
          Out[3]: 
          #      table
          0      '(0, [83.98, 92.38, 82.  , 83.52], [       0,   ...
          1      '(1, [83.9 , 83.92, 83.9 , 83.91], [      1,    ...
          2      '(2, [84.5 , 84.65, 84.  , 84.51], [      2,    ...
          3      '(3, [84.9 , 85.06, 84.9 , 84.99], [      3,    ...
          4      '(4, [85.1 , 85.2 , 85.1 , 85.13], [      4,    ...
          ...    ...
          3,917  '(3917, [274.65, 275.35, 274.6 , 274.61], [     ...
          3,918  '(3918, [274.4, 275.2, 274.1, 275. ], [      391...
          3,919  '(3919, [275.  , 275.01, 274.  , 274.19], [     ...
          3,920  '(3920, [275.2, 275.2, 272.6, 272.9], [      392...
          3,921  '(3921, [272.96, 273.73, 272.5 , 272.93], [     ...

          在這個數據中,丟失了最關鍵的索引信息,雖然數據都被正確地保留了下來,但是在讀取上有非常大的不便。因此我們更加推薦第二種數據轉換的方法,直接用vaex進行數據格式的轉換:

          [dechin@dechin-manjaro gold]$ ipython
          Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
          Type 'copyright', 'credits' or 'license' for more information
          IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.
          
          In [1]: import vaex
          
          In [2]: df=vaex.from_csv('data.csv')
          
          In [3]: df.export_hdf5('vaex_data.hdf5')
          
          In [4]: !ls -l
          總用量 1220
          -rw-r--r-- 1 dechin dechin 221856  3月 27 22:34 data.csv
          -rw-r--r-- 1 dechin dechin 348436  3月 27 22:34 data.hdf5
          -rw-r--r-- 1 dechin dechin 372736  3月 27 21:31 data.xls
          -rw-r--r-- 1 dechin dechin    563  3月 27 21:42 table.py
          -rw-r--r-- 1 dechin dechin 293512  3月 27 22:52 vaex_data.hdf5

          執行完畢后在當前目錄下生成了一個vaex_data.hdf5文件,讓我們再試試讀取這個新的hdf5文件:

          [dechin@dechin-manjaro gold]$ ipython
          Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
          Type 'copyright', 'credits' or 'license' for more information
          IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.
          
          In [1]: import vaex
          
          In [2]: df=vaex.open('vaex_data.hdf5')
          
          In [3]: df
          Out[3]: 
          #      i     t             s       h       l      e       n      a
          0      0     '2002-10-30'  83.98   92.38   82.0   83.52   352    29373370
          1      1     '2002-10-31'  83.9    83.92   83.9   83.91   66     5537480
          2      2     '2002-11-01'  84.5    84.65   84.0   84.51   77     6502510
          3      3     '2002-11-04'  84.9    85.06   84.9   84.99   95     8076330
          4      4     '2002-11-05'  85.1    85.2    85.1   85.13   61     5193650
          ...    ...   ...           ...     ...     ...    ...     ...    ...
          3,917  3917  '2018-11-23'  274.65  275.35  274.6  274.61  13478  3708580608
          3,918  3918  '2018-11-26'  274.4   275.2   274.1  275.0   13738  3773763584
          3,919  3919  '2018-11-27'  275.0   275.01  274.0  274.19  13984  3836845568
          3,920  3920  '2018-11-28'  275.2   275.2   272.6  272.9   15592  4258130688
          3,921  3921  '2018-11-28'  272.96  273.73  272.5  272.93  592    161576336
          
          In [4]: df.s
          Out[4]: 
          Expression=s
          Length: 3,922 dtype: float64 (column)
          -------------------------------------
             0   83.98
             1    83.9
             2    84.5
             3    84.9
             4    85.1
              ...     
          3917  274.65
          3918   274.4
          3919     275
          3920   275.2
          3921  272.96
          
          In [11]: df.plot(df.i, df.s, show=True) # 作圖
          /home/dechin/anaconda3/lib/python3.8/site-packages/vaex/viz/mpl.py:311: UserWarning: `plot` is deprecated and it will be removed in version 5.x. Please `df.viz.heatmap` instead.
            warnings.warn('`plot` is deprecated and it will be removed in version 5.x. Please `df.viz.heatmap` instead.')

          這里我們也需要提一下,在新的hdf5文件中,索引從高、低等中文變成了h、l等英文,這是為了方便數據的操作,我們在csv文件中將索引手動的修改成了英文,再轉換成hdf5的格式。最后我們使用vaex自帶的畫圖功能,繪制了這十幾年期間黃金的價格變動:


          由于vaex自帶的繪圖方法比較少,總結如下:


          最常用的還是熱度圖,因此這里繪制出來的黃金價格圖的效果也是熱度圖的效果,但是基本上功能是比較完備的,而且性能異常的強大。

          總結概要

          在這篇文章中我們介紹了三種不同的python庫對表格數據進行處理,分別是xlrd、pandas和vaex,其中特別著重的強調了一下vaex的優越性能以及在大數據中的應用價值。配合一些簡單的示例,我們可以初步地了解到這些庫各自的特點,在實際場景中可以斟酌使用。

          版權聲明

          本文首發鏈接為:https://www.cnblogs.com/dechinphy/p/vaex.html
          作者ID:DechinPhy
          更多原著文章請參考:https://www.cnblogs.com/dechinphy/

          參考鏈接

          1. https://zhuanlan.zhihu.com/p/240797772
          1. 先,確保已經安裝了pandas和Django庫。如果沒有安裝,可以使用以下命令進行安裝:
          pip install pandas
          pip install django
          1. 在Django項目的views.py文件中,編寫一個視圖函數,用于處理數據并將其傳遞給前端模板。在這個函數中,我們將使用pandas讀取數據,并將其轉換為HTML表格格式。代碼如下:
          import pandas as pd
          from django.shortcuts import render
          
          def data_to_html(request):
              # 讀取CSV文件(這里假設你的數據存儲在一個名為data.csv的文件中)
              data=pd.read_csv('data.csv')
          
              # 將數據轉換為HTML表格格式
              html_table=data.to_html()
          
              # 將HTML表格作為上下文變量傳遞給前端模板
              context={'html_table': html_table}
          
              # 渲染前端模板并返回響應
              return render(request, 'your_template.html', context)
          1. 在urls.py文件中,為剛剛創建的視圖函數添加一個URL映射。代碼如下:
          from django.urls import path
          from . import views
          
          urlpatterns=[
              # 其他URL映射...
              path('data/', views.data_to_html, name='data_to_html'),
          ]
          1. 創建一個HTML模板文件(例如your_template.html),并在其中插入一個<div>元素,用于顯示HTML表格。代碼如下:
          <!DOCTYPE html>
          <html>
          <head>
              <title>Data to HTML</title>
          </head>
          <body>
              <!-- 在這里插入HTML表格 -->
              {{ html_table|safe }}
          </body>
          </html>
          1. 最后,運行Django開發服務器,訪問http://localhost:8000/data/,你應該能看到從CSV文件中讀取的數據以HTML表格的形式顯示在頁面上。

          • 技術背景
          • 使用tabulate美化表格輸出
          • 使用prettytable美化輸出
          • 總結概要
          • 版權聲明
          • 參考鏈接

          技術背景

          在前面一篇博客中我們介紹過關于python的表格數據處理方案,這其中的工作重點就是對表格類型的數據進行梳理、計算和展示,本文重點介紹展示這個方面的工作。首先我們看一個案例,定義一個數組形式的表格數據:

          [dechin@dechin-manjaro table]$ ipython
          Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
          Type 'copyright', 'credits' or 'license' for more information
          IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.
          
          In [1]: table=[('a',1,2,3),('b',2,3,4)]
          
          In [2]: print(table)
          [('a', 1, 2, 3), ('b', 2, 3, 4)]

          當我們直接打印這個表格數據的時候,發現效果非常的難看。雖然我們可以從這個表格中獲取到同樣的信息,但是這種數據展示的方法對于我們直接從打印輸出中獲取數據是非常不利的。

          使用tabulate美化表格輸出

          首先介紹一個工具tabulate,可以直接打印數組格式的表格數據,并且有多種輸出格式可選。安裝方法同樣可以用pip來進行管理:

          [dechin@dechin-manjaro table]$ python3 -m pip install tabulate
          Requirement already satisfied: tabulate in /home/dechin/anaconda3/lib/python3.8/site-packages (0.8.9)

          安裝很容易,也沒有其他依賴。接下來我們用ipython來展示一些基本用法:

          [dechin@dechin-manjaro table]$ ipython
          Python 3.8.5 (default, Sep  4 2020, 07:30:14) 
          Type 'copyright', 'credits' or 'license' for more information
          IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.
          
          In [1]: from tabulate import tabulate
          
          In [2]: import numpy as np
          
          In [3]: header=['index']+list(range(4)) # 表頭的定義
          
          In [4]: header
          Out[4]: ['index', 0, 1, 2, 3]
          
          In [8]: table=[('Alice',1,2,3,4),('Bob',2,3,4,5)] # 表格內容的定義
          
          In [9]: table
          Out[9]: [('Alice', 1, 2, 3, 4), ('Bob', 2, 3, 4, 5)]
          
          In [11]: print(tabulate(table,headers=header,tablefmt='grid')) # 用grid的格式打印表格內容
          +---------+-----+-----+-----+-----+
          | index   |   0 |   1 |   2 |   3 |
          +=========+=====+=====+=====+=====+
          | Alice   |   1 |   2 |   3 |   4 |
          +---------+-----+-----+-----+-----+
          | Bob     |   2 |   3 |   4 |   5 |
          +---------+-----+-----+-----+-----+
          
          In [12]: print(tabulate(table,headers=header,tablefmt='fancy_grid')) # 用fancy_grid的格式打印
          ╒═════════╤═════╤═════╤═════╤═════╕
          │ index   │   0 │   1 │   2 │   3 │
          ╞═════════╪═════╪═════╪═════╪═════╡
          │ Alice   │   1 │   2 │   3 │   4 │
          ├─────────┼─────┼─────┼─────┼─────┤
          │ Bob     │   2 │   3 │   4 │   5 │
          ╘═════════╧═════╧═════╧═════╧═════╛

          在這個案例中,我們分別產生了數組格式的表頭和表格內容,然后用tabulate進行封裝之后再打印出來。由于tabulate支持多種格式的輸出,這里我們展示的僅有gridfancy_grid兩種個人比較喜歡的格式。其他類型的格式還有:

          "plain"
          "simple"
          "github"
          "grid"
          "fancy_grid"
          "pipe"
          "orgtbl"
          "jira"
          "presto"
          "psql"
          "rst"
          "mediawiki"
          "moinmoin"
          "youtrack"
          "html"
          "latex"
          "latex_raw"
          "latex_booktabs"
          "textile"

          使用prettytable美化輸出

          類似于tabulate的,prettytable的主要目的也是規范化的美化表格數據的輸出,但是在使用方法上略有差異,在不同的場景下可以使用不同的方案。這里我們先看一下prettytable的安裝,同樣可以使用pip來進行管理:

          [dechin@dechin-manjaro table]$ python3 -m pip install prettytable
          Collecting prettytable
            Downloading prettytable-2.1.0-py3-none-any.whl (22 kB)
          Requirement already satisfied: wcwidth in /home/dechin/anaconda3/lib/python3.8/site-packages (from prettytable) (0.2.5)
          Installing collected packages: prettytable
          Successfully installed prettytable-2.1.0

          安裝完成后我們用一個py文件的示例來展示其用法:

          # pt_test.py
          
          from prettytable import PrettyTable
          
          tb=PrettyTable() # 生成表格對象
          tb.field_names=['Index', 0, 1, 2, 3] # 定義表頭
          tb.add_row(['Alice',1,2,3,4]) # 添加一行,列是column
          tb.add_row(['Bob',2,3,4,5])
          
          print (tb) # 打印輸出

          代碼的執行結果如下:

          [dechin@dechin-manjaro table]$ python3 pt_test.py 
          +-------+---+---+---+---+
          | Index | 0 | 1 | 2 | 3 |
          +-------+---+---+---+---+
          | Alice | 1 | 2 | 3 | 4 |
          |  Bob  | 2 | 3 | 4 | 5 |
          +-------+---+---+---+---+
          

          由于使用的案例跟上面介紹的tabulate是一樣的,所以輸出結果也類似,相當于多了一種輸出格式。但是除了輸出格式之外,我們發現prettytable可以很好地利用行和列的添加的形式來進行表格操作,操作習慣更接近于數據庫的操作形式,因此對于經常使用數據庫的人而言,prettytable可能是一種更好的表格數據輸出解決方案。

          總結概要

          本文介紹了兩種表格數據的打印工具:tabulate和prettytable的安裝與基本使用方法。由于表格數據本身是沒有對輸出格式進行規范化的,因此打印出來的數據會顯得比較雜亂,不利于直觀的閱讀。因此引入這兩種工具,加強了輸出結果的可讀性。這兩者在使用上各有優劣,tabulate支持更多形式的表格樣式,而prettytable則使用了更加接近于數據庫的操作形式,對于部分用戶而言有天然的生態優勢。

          版權聲明

          本文首發鏈接為:https://www.cnblogs.com/dechinphy/p/table.html
          作者ID:DechinPhy
          更多原著文章請參考:https://www.cnblogs.com/dechinphy/

          打賞專用鏈接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

          參考鏈接

          1. https://blog.csdn.net/qq_43901693/article/details/104920856
          2. https://blog.csdn.net/u010359398/article/details/82766474

          主站蜘蛛池模板: 色国产精品一区在线观看| 香蕉久久一区二区不卡无毒影院| 中文字幕Av一区乱码| 亚洲一区二区三区久久| 无码日韩人妻AV一区二区三区| 亚洲宅男精品一区在线观看| 中文字幕精品无码一区二区三区| 一区二区国产精品| 国产麻豆精品一区二区三区| 老熟妇仑乱一区二区视頻| 亚洲一区二区三区偷拍女厕| 亚洲AV无码一区二区大桥未久| 久久久久人妻一区二区三区vr| 中文字幕一区二区人妻| 久久久久女教师免费一区| 波多野结衣中文一区| 国产伦精品一区二区三区精品| 国产怡春院无码一区二区| 亚洲AV一区二区三区四区| 国内自拍视频一区二区三区 | 怡红院美国分院一区二区| 伊人色综合网一区二区三区| 亚洲AV无一区二区三区久久| 亚洲一区二区三区偷拍女厕| 中文字幕AV一区二区三区| 国产精品一区二区无线| 中文字幕一区二区三| 中文字幕一区日韩精品| 国产在线精品一区二区不卡| 久久久久人妻一区精品果冻| 激情一区二区三区| 一区二区亚洲精品精华液| 午夜福利一区二区三区高清视频 | 国产乱码精品一区二区三区四川 | 国产精品99精品一区二区三区 | 全国精品一区二区在线观看| 亚洲AV无码一区二区三区鸳鸯影院| 亚洲国产一区在线观看| 精品少妇一区二区三区视频| 中文字幕一区二区三区在线播放| 国产精品一区二区久久精品无码|