日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

[python] 基于Tablib库处理表格数据

發布時間:2023/11/30 python 36 coder
生活随笔 收集整理的這篇文章主要介紹了 [python] 基于Tablib库处理表格数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tablib是一個用于處理電子表格(如 Excel,CSV,JSON)的Python 庫。它提供了一種簡單而強大的方式來操作和處理數據。利用Tablib,我們可以輕松地讀取、寫入、過濾和轉換各種類型的電子表格數據。Tablib 具有一致且易于使用的 API,以在不同的數據格式之間進行無縫轉換。比如,Tablib可以將數據從Excel表格導入為Python對象,然后將其轉換為JSON或CSV格式,并進行相應的操作和分析。此外Tablib還支持對數據進行排序、篩選和合并等常見操作。Tablib官方倉庫地址為:tablib,Tablib官方文檔地址為:tablib-doc。

Tablib需要在Python3.6+版本下安裝,安裝命令如下:

pip install tablib

import tablib
# 查看版本
tablib.__version__
'3.4.0'

目錄
  • 1 Tablib使用
    • 1.1 表格創建
    • 1.2 數據導入與導出
    • 1.3 多表管理
    • 1.4 進階使用
  • 2 參考

1 Tablib使用

1.1 表格創建

創建數據結構

# 創建表
data = tablib.Dataset()
type(data)
tablib.core.Dataset
# 查看表格名字,默認為空
data.title 
# 設置表的名字
data.title = 'data'
data.title
'data'

數據添加

# 添加行
data.append(['John', 28])
data.append(['Tom', 16])
data.append(['Jane', 32])
# 查看數據,list格式
data.dict
# 或者
# print(data)
[['John', 28], ['Tom', 16], ['Jane', 32]]
# 添加標題行
data.headers = ['Name', 'Age']
# data.dict
print(data)
Name|Age
----|---
John|28 
Tom |16 
Jane|32 
# 添加列
# 需要和當前行數一致
data.append_col(['USA', 'UK','UK'], header='Country')
# data.dict
print(data)
Name|Age|Country
----|---|-------
John|28 |USA    
Tom |16 |UK     
Jane|32 |UK     

選擇行或列

# 選擇第一行
data[0]
('John', 28, 'USA')
# 選擇第一行第三列
data[0][2]
'USA'
# 選擇列
data['Age']
[28, 16, 32]
# 獲得表頭
data.headers
['Name', 'Age', 'Country']
# 基于索引獲得列
data.get_col(0)
['John', 'Tom', 'Jane']

刪除行或列

# 刪除列
del data['Country']
# 刪除行
# del data[:-1]
print(data)
Name|Age
----|---
John|28 
Tom |16 
Jane|32 

行列高級操作

# 表格轉置
transposed_data = data.transpose()
print(transposed_data)
Name|John|Tom|Jane
----|----|---|----
Age |28  |16 |32  
# 讀取數據維度
data.width,data.height
(2, 3)
# 按照字段排序
# 年齡從大到小排序
data = data.sort("Age",reverse=True)
print(data)
Name|Age
----|---
Jane|32 
John|28 
Tom |16 
# 計算平均年齡
ages = data['Age']
float(sum(ages)) / len(ages)
25.333333333333332
# 移除第一行
tmp = data.lpop()
print(data)
Name|Age
----|---
John|28 
Tom |16 
# 第一行添加數據
data.lpush(list(tmp))
print(data)
Name|Age
----|---
Jane|32 
John|28 
Tom |16 
# 在最左側插入一列數據
new_column = ['Engineer', 'Doctor','Doctor']
data.lpush_col(new_column, header='Profession')
print(data)
Profession|Name|Age
----------|----|---
Engineer  |Jane|32 
Doctor    |John|28 
Doctor    |Tom |16 
# 移除最后一行
# data.pop()
# print(data)
# 移除重復行
# 創建數據集
data = tablib.Dataset()
data.headers = ['Name', 'Age']
data.append(['Alice', 25])
data.append(['Alice', 30])
data.append(['Alice', 25])  # 重復行

# 去除重復行,必須所有列值一樣
data.remove_duplicates()

print(data)
Name |Age
-----|---
Alice|25 
Alice|30 

表格合并

# 創建兩個表格
data1 = tablib.Dataset()
data1.headers = ['Name', 'Age']
data1.append(['Alice', 25])
data1.append(['Bob', 30])

data2 = tablib.Dataset()
data2.headers = ['Name', 'Occupation']
data2.append(['Alice', 'Engineer'])
data2.append(['Bob', 'Doctor'])
# 按行合并
# 使用stack方法合并兩個表格
stacked_data = data1.stack(data2)
print(stacked_data)
Name |Age     
-----|--------
Alice|25      
Bob  |30      
Alice|Engineer
Bob  |Doctor  
# 按列合并
# 兩個表格行數需要一致
# 使用stack_cols方法合并兩個表格的列
stacked_cols_data = data1.stack_cols(data2)
print(stacked_cols_data)
Name |Age|Name |Occupation
-----|---|-----|----------
Alice|25 |Alice|Engineer  
Bob  |30 |Bob  |Doctor    

1.2 數據導入與導出

數據導出

Tablib使得用戶可以根據具體需求將數據靈活地導出到不同的環境中,并與其他工具進行無縫集成和交互。轉換的結果是這些格式的對象表示而不是存為本地文件。這些格式包括但不限于:

  • CSV:常見的電子表格格式,每個字段由逗號分隔。
  • JSON:一種常見的數據交換格式,以鍵值對的形式存儲數據。
  • Excel:電子表格格式,需要額外安裝庫,可以包含多個工作表,并支持公式和圖表等功能。
  • YAML:一種易讀的數據序列化格式,常用于配置文件。
  • HTML:用于創建網頁的標記語言。
  • Pandas DataFrame:Pandas是另一個Python庫,用于數據處理和分析。Tablib支持將數據導出為Pandas DataFrame。

Tablib提供了兩種方式將數據導出為其他格式,一種是調用export函數,一種是調用自帶屬性。如下所示data.export('csv') 和data.csv都可以用于獲取Dataset數據的CSV表示:

data.export('csv')
data.csv

具體示例代碼如下:

# 創建表格
data = tablib.Dataset()
data.headers = ['Name', 'Age']
data.append(['John', 28])
data.append(['Tom', 16])
data.append(['Jane', 32])
# 導出為csv字符流
data_csv = data.export('csv')
print(type(data_csv))

# 導出數據到本地csv文件
with open('data.csv', 'w') as f:
    f.write(data_csv)
<class 'str'>
# 導出為json字符串
data_json = data.export('json')
type(data_json)

# 將json字符串解析為Python對象
import json
data_json = json.loads(data_json)
print(data_json)
[{'Name': 'John', 'Age': 28}, {'Name': 'Tom', 'Age': 16}, {'Name': 'Jane', 'Age': 32}]
# 將數據集對象保存為json文件
with open('data.json', 'w') as f:
    f.write(data.export('json'))
# 保存為yaml文件
with open('data.yml', 'w') as f:
    f.write(data.export('yaml'))
# 將數據集保存為xls文件,注意使用wb模式
# 需要安裝額外庫
# pip install xlrd
# pip install xlwt
with open('data.xls', 'wb') as f:
    f.write(data.export('xls'))

with open('data.xlsx', 'wb') as f:
    f.write(data.export('xlsx'))
# 轉換為html
# 需要安裝MarkupPy庫
# pip install MarkupPy 
with open('data.html', 'w') as f:
    f.write(data.export('html'))
# 轉換為pandas的dataframe
# 需要安裝Pandas庫
df = data.export('df')
df.head()
Name Age
0 John 28
1 Tom 16
2 Jane 32

數據導入

我們可以使用tablib庫導入多種格式的文件,以初始化tablib的數據對象。如下所示:

with open('data.csv', 'r') as fh:
    imported_data = tablib.Dataset().load(fh)
print(imported_data)
Name|Age
----|---
John|28 
Tom |16 
Jane|32 

對于表格類格式,如csv格式,也可以不導入標題行,即不將第一行作為標題行,如下所示:

with open('data.csv', 'r') as fh:
    # headers=False不導入標題行
    imported_data = tablib.Dataset().load(fh,headers=False)
print(imported_data)
Name|Age
John|28 
Tom |16 
Jane|32 

對于支持多表的xls、xlsx,當前默認打開第一個表,注意使用rb模式。多表管理見下一節。

with open('data.xls', 'rb') as fh:
    imported_data =  tablib.Dataset().load(fh, 'xls')
print(imported_data)

Name|Age 
----|----
John|28.0
Tom |16.0
Jane|32.0

1.3 多表管理

在Tablib中,Databook是一種數據結構,用于組織和管理多個數據表(Data Table。Databook提供了一種方便的方式來操作和處理多個數據表

創建Databook

# 創建Databook
databook = tablib.Databook()
# 創建第一個數據表
data_table1 = tablib.Dataset()

# 設置數據表的列和數據
data_table1.headers = ['Name', 'Age']
data_table1.append(['John', 25])
data_table1.append(['Alice', 30])
# 設置表名
data_table1.title = "table1"

# 添加數據表到 Databook
databook.add_sheet(data_table1)
# 創建二個數據表
data_table2 = tablib.Dataset()

# 設置數據表的列和數據
data_table2.headers = ['Name', 'Age']
data_table2.append(['Jane', 34])
data_table2.append(['Mike', 14])
# 設置表名
data_table2.title = "table2"

# 添加數據表到 Databook
databook.add_sheet(data_table2)
# 可以利用現有表一次性創建Databoook
tablib.Databook((data_table1, data_table2))
<databook object>

查看databook

# 查看子表數量
databook.size
2
# 查看各表
databook.sheets()
[<table1 dataset>, <table2 dataset>]

根據索引獲得表

for index,table in enumerate(databook.sheets()):
    print(f" \ntable{index}")
    print(table)
table0
Name |Age
-----|---
John |25 
Alice|30 
 
table1
Name|Age
----|---
Jane|34 
Mike|14 

保存與導入

databook支持保存xlsx和xls文件,但是導入僅支持xlsx文件。

# 保存為xlsx文件
with open('databook.xlsx', 'wb') as f:
    f.write(databook.export('xlsx'))
# 多表導入
with open(r'databook.xlsx', 'rb') as fh:
    databook = tablib.Databook().load(fh, 'xlsx')
print(databook.sheets())
[<table1 dataset>, <table2 dataset>]

1.4 進階使用

動態列

Talblib允許在數據表格中隨意創建和管理動態列。這些列不需要預先定義,可以根據需要隨時添加、刪除和修改。如下所示根據隨機函數設置列:

# 導入數據
with open('data.csv', 'r') as fh:
    data = tablib.Dataset().load(fh)
print(data)
Name|Age
----|---
John|28 
Tom |16 
Jane|32 
import random

# 隨機設置分數
def random_grade(row):
    # 根據傳入的行設置不同數據標準
    if int(row[1]) > 30:
        return (random.randint(59,100)/100.0)
    else:
        return (random.randint(60,99)/100.0)

data.append_col(random_grade, header='Grade')
print(data)
Name|Age|Grade
----|---|-----
John|28 |0.65 
Tom |16 |0.99 
Jane|32 |0.79 

數據過濾

Tablib提供了filter方法,以根據數據集的標簽(tags)來過濾數據。

fruits = tablib.Dataset()  

fruits.headers = ['name', 'color'] 
# 添加tags為fruit與sour的行
fruits.append(['tomato', 'red'], tags=['fruit', 'sour']) 
fruits.append(['strawberry', 'red'], tags=['fruit', 'sweet' ]) 
fruits.append(['corn', 'yellow'], tags=['vegetable', 'sweet']) 

# 轉換為其他格式,tags屬性不會跟隨轉換
print(fruits.yaml)
- {color: red, name: tomato}
- {color: red, name: strawberry}
- {color: yellow, name: corn}
# 過濾出標簽為vegetable的數據
fruits.filter(['vegetable']).df  
name color
0 corn yellow
# 過濾出標簽為vegetable或sweet的數據
fruits.filter(['vegetable', 'sweet']).df  
name color
0 strawberry red
1 corn yellow
# 先過濾出標簽為fruit,再過濾為sour的數據
fruits.filter(['fruit']).filter(['sour']).df  
name color
0 tomato red

分割符

Tablib提供了append_separator函數,以在excel表格中添加分隔符,如下所示:

# Daniel和Suzie的測試數據
daniel_tests = [
    ('11/24/09', 'Apple', 'Red'),
    ('05/24/10', 'Banana', 'Yellow')
]

suzie_tests = [
    ('11/24/09', 'Orange', 'Orange'),
    ('05/24/10', 'Grapes', 'Purple')
]

# 創建新的數據集
tests = tablib.Dataset()
tests.headers = ['Date', 'Fruit Name', 'Color']

# 添加分隔符
tests.append_separator('Fruits A')  
for test_row in daniel_tests:
   tests.append(test_row)

# 添加分隔符
tests.append_separator('')  
for test_row in suzie_tests:
   tests.append(test_row)

# 將數據集寫入磁盤,以xls格式存儲
with open('fruits.xls', 'wb') as f:
    f.write(tests.export('xls'))

通過展示xls數據,可以看到在某些行添加了空行數據。


# 導入pandas庫
import pandas as pd

# 從xls文件中讀取數據,并將其存儲在DataFrame中
pd.read_excel('fruits.xls', keep_default_na=False)

Date Fruit Name Color
0 Fruits A
1 11/24/09 Apple Red
2 05/24/10 Banana Yellow
3
4 11/24/09 Orange Orange
5 05/24/10 Grapes Purple

格式化列

Tablib提供add_formatter函數用于向Dataset對象添加自定義格式化程序,以便在導出數據時按照指定格式進行格式化。

# 創建一個空的 Dataset 對象
data = tablib.Dataset()

# 添加數據到 Dataset
data.headers = ['name','age','role']
data.append(['John', 28, 'Developer'])
data.append(['Amy', 25, 'Designer'])

# 定義一個自定義的格式化函數
def custom_formatter(val):
    if isinstance(val, int):
        return f'Age: {val}'
    elif isinstance(val, str):
        return val.upper()
    else:
        return str(val)

# 添加自定義格式化函數到 Dataset
# 第一個參數可以為列號
data.add_formatter(0,custom_formatter)
# 如果有列名,也可以指定列名
data.add_formatter('age',custom_formatter)

# 導出數據并應用自定義格式化函數
data.df
name age role
0 JOHN Age: 28 Developer
1 AMY Age: 25 Designer

創建子表格

# 創建表格
data = tablib.Dataset()
data.headers = ['Name', 'Age','Profession']
data.append(['Alice', 25, 'Doctor'])
data.append(['Bob', 30, 'Doctor'])
data.append(['Jack', 28, 'Engineer'])
# subset方法用于從現有的數據集中選擇子集
# rows表示行號,rows=[0, 2]表示選擇第0行和第2行
sub_data = data.subset(rows=[0, 2], cols=['Name', 'Profession'])
sub_data.df
Name Profession
0 Alice Doctor
1 Jack Engineer

2 參考

  • tablib
  • tablib-doc。

總結

以上是生活随笔為你收集整理的[python] 基于Tablib库处理表格数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。