1. 程式人生 > >Python模組學習 ---- struct 資料格式轉換

Python模組學習 ---- struct 資料格式轉換

 Python是一門非常簡潔的語言,對於資料型別的表示,不像其他語言預定義了許多型別(如:在C#中,光整型就定義了8種),它只定義了六種基本型別:字串,整數,浮點數,元組,列表,字典。通過這六種資料型別,我們可以完成大部分工作。但當Python需要通過網路與其他的平臺進行互動的時候,必須考慮到將這些資料型別與其他平臺或語言之間的型別進行互相轉換問題。打個比方:C++寫的客戶端傳送一個int型(4位元組)變數的資料到Python寫的伺服器,Python接收到表示這個整數的4個位元組資料,怎麼解析成Python認識的整數呢? Python的標準模組struct就用來解決這個問題。

  struct模組的內容不多,也不是太難,下面對其中最常用的方法進行介紹:

 struct.pack

  struct.pack用於將Python的值根據格式符,轉換為字串(因為Python中沒有位元組(Byte)型別,可以把這裡的字串理解為位元組流,或位元組陣列)。其函式原型為:struct.pack(fmt, v1, v2, ...),引數fmt是格式字串,關於格式字串的相關資訊在下面有所介紹。v1, v2, ...表示要轉換的python值。下面的例子將兩個整數轉換為字串(位元組流):

  1. import struct  
  2. a = 20
  3. b = 400
  4. str = struct.pack("ii", a, b)  #轉換後的str雖然是字串型別,但相當於其他語言中的位元組流(位元組陣列),可以在網路上傳輸
  5. print'length:', len(str)  
  6. print str  
  7. print repr(str)  
  8. #---- result
  9. #length: 8
  10. #    ----這裡是亂碼
  11. #'/x14/x00/x00/x00/x90/x01/x00/x00'

格式符"i"表示轉換為int,'ii'表示有兩個int變數。進行轉換後的結果長度為8個位元組(int型別佔用4個位元組,兩個int為8個位元組),可以看到輸出的結果是亂碼,因為結果是二進位制資料,所以顯示為亂碼。可以使用python的內建函式repr來獲取可識別的字串,其中十六進位制的0x00000014, 0x00001009分別表示20和400。

struct.unpack

  struct.unpack做的工作剛好與struct.pack相反,用於將位元組流轉換成python資料型別。它的函式原型為:struct.unpack(fmt, string),該函式返回一個元組

。 下面是一個簡單的例子:

  1. str = struct.pack("ii"20400)  
  2. a1, a2 = struct.unpack("ii", str)  
  3. print'a1:', a1  
  4. print'a2:', a2  
  5. #---- result:
  6. #a1: 20
  7. #a2: 400

struct.calcsize

  struct.calcsize用於計算格式字串所對應的結果的長度,如:struct.calcsize('ii'),返回8。因為兩個int型別所佔用的長度是8個位元組。

struct.pack_into, struct.unpack_from

   這兩個函式在Python手冊中有所介紹,但沒有給出如何使用的例子。其實它們在實際應用中用的並不多。Google了很久,才找到一個例子,貼出來共享一下:

  1. import struct  
  2. from ctypes import create_string_buffer  
  3. buf = create_string_buffer(12)  
  4. print repr(buf.raw)  
  5. struct.pack_into("iii", buf, 012, -1)  
  6. print repr(buf.raw)  
  7. print struct.unpack_from('iii', buf, 0)  
  8. #---- result
  9. #'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00'
  10. #'/x01/x00/x00/x00/x02/x00/x00/x00/xff/xff/xff/xff'
  11. #(1, 2, -1)

關於格式字串

  在Python手冊中,給出了C語言中常用型別與Python型別對應的格式符:

格式符 C語言型別 Python型別
x pad byte no value
c char string of length 1
b signed char integer
B unsigned char integer
? _Bool bool
h short integer
H unsigned short integer
i int integer
I unsigned int integer or long
l long integer
L unsigned long long
q long long long
Q unsigned long long long
f float float
d double float
s char[] string
p char[] string
P void * long

具體內容請參考Python手冊 struct 模組

相關推薦

Python模組學習 ---- struct 資料格式轉換

 Python是一門非常簡潔的語言,對於資料型別的表示,不像其他語言預定義了許多型別(如:在C#中,光整型就定義了8種),它只定義了六種基本型別:字串,整數,浮點數,元組,列表,字典。通過這六種資料型別,我們可以完成大部分工作。但當Python需要通過網路與其他的平臺進行

Python模組學習系列(2)----struct

轉自:http://www.cnblogs.com/coser/archive/2011/12/17/2291160.html 瞭解c語言的人,一定會知道struct結構體在c語言中的作用,它定義了一種結構,裡面包含不同型別的資料(int,char,bool等等),方便對某

把JSON資料格式轉換Python的類物件

JOSN字串轉換為自定義類例項物件 有時候我們有這種需求就是把一個JSON字串轉換為一個具體的Python類的例項,比如你接收到這樣一個JSON字串如下: {"Name": "Tom", "Sex": "Male", "

MySQL中資料格式轉換

MySQL 的CAST()和CONVERT()函式可用來獲取一個型別的值,併產生另一個型別的值。具體用法如下:      CAST(value as type);   CONVERT(value, 

Python機器學習資料預處理

# -*- coding: utf-8 -*- """ Created on Sat Sep 29 22:39:26 2018 @author: Lxiao217 email:[email protected] """ #資料預處理 #CSV(comma-srpared values,

python模組學習】pickle庫學習實錄

pickle模組簡介     pickle模組可以將記憶體中的Python物件轉化成序列化的位元組流,這是一種可以寫入任何類似檔案物件的位元組串。pickle模組也可以根據序列化的位元組流重新構建原來記憶體中的物件:轉換成原來那個物件。&nbs

SpringMVC總結--資料格式轉換資料校驗

SpringMVC資料繫結流程        A:SpingMVC 主框架將 ServletRequest 物件及目標方法的入參例項傳遞 WebDataBinderFactory 例項,以建立DataBinder 例項物件     &nbs

關於json時間資料格式轉換與修改

使用easyui獲取JSON時間資料時間資料時,通常是一長串的數字而不是我們想要的類似2018-11-01的普通時間格式。 此時我們就需要使用到關於JSON時間的格式化,而將時間轉化成我們想要的格式。 一般轉化格式 之前一直使用的  toLocaleDateString()  但是用

time 模組處理時間資料格式的幾種方式

time 模組中處理時間資料格式的幾種方式 在 time 模組中,時間資料主要有三種格式:時間戳(timeStamp)、時間陣列(timeStruct)和時間字串(timeStr)。形式如下圖所示: 對於這三種格式的資料,時間戳與時間陣列之間可以互相轉換,時間陣列和時間字串之間可以互相

python CST中國標準時間格式轉換

def trans_format(time_string, from_format, to_format='%Y.%m.%d %H:%M:%S'): """ @note 時間格式轉化 :param time_string: :param from_format:

Python 模組學習——bisect

bisect是一個排序模組,操作物件必須為排好序的列表。 insort()函式: 在不影響排序的情況下插入元素。 bisect()函式: 找出在不影響排序的情況下元素應該插入的位置,但不會插入元素 可以看出6並沒有被插入列表d中 bisect

Python模組學習——logging

logging模組是在2.3新引進的功能,下面是一些常用的類和模組級函式 模組級函式 logging.getLogger([name]):返回一個logger物件,如果沒有指定名字將返回root logger logging.debug()、logging.in

Python模組學習——tempfile

主要有以下幾個函式: tempfile.TemporaryFile 如何你的應用程式需要一個臨時檔案來儲存資料,但不需要同其他程式共享,那麼用TemporaryFile函式建立臨時檔案是最好的選擇。其他的應用程式是無法找到或開啟這個檔案的,因為它並沒有引用檔案系統表。用這

python:字串與資料轉換

整數或浮點數轉換為字串: score = 98 print("您的分數為:"+str(score)) 輸出結果: 您的分數為:98 字串轉換為整數: x = input("輸入x: ") # 輸入的x為字串型別 y = input("輸入y: ") # 輸入的y

tf.cast資料格式轉換函式

#cast(x, dtype, name=None) #將x的資料格式轉化成dtype. import tensorflow as tf a = tf.Variable([1,0,0,1,1]) b = tf.cast(a,dtype=tf.bool) sess = tf.Session

python模組學習

import 語句 想使用 Python 原始檔,只需在另一個原始檔裡執行 import 語句,語法如下: import module1[, module2[,... moduleN] 當直譯器遇到 import 語句,如果模組在當前的搜尋路徑就會被匯入。 搜尋路徑是

Python基礎學習資料型別

#列表 list1=[1,2,3] print(type(list1))   #字典 dict1={"title":"web開發"} print(type(dict1)) print(dict1['title'])   #元組 tuple1=(11

使用Gson進行資料格式轉換時的問題

Gson是谷歌出的解析json資料的工具. 在專案測試中, 出現了空指標異常,很是奇妙, 傳的引數沒有接收到..  發現是前端傳的引數, 沒有正確的解析, 所以沒有識到到引數.. com.****.****.****.****: java.lang.IllegalSta

ECharts柱狀圖資料格式轉換通用工具類

ECharts柱狀圖 當我們不想直接把資料直接展示到頁面時,我們可以把資料繪製一個簡單的圖表展示出來,這樣既美觀又形象。下面是我封裝的一個用來把資料格式轉換為Echarts柱狀圖所需要資料的方法。 /** * 封裝了一個用於生成前端柱狀圖對應資料結構所需資料的

python獲取時間及時間格式轉換

整理總結一下python中最常用的一些時間戳和時間格式的轉換 第一部分:獲取當前時間和10位13位時間戳 import datetime, time '''獲取當前時間''' n = datetime.datetime.now() print(n) '''獲取10位時間戳''' now