最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決Python3 struct報(bào)錯(cuò)argument for 's' must be a bytes object

 更新時(shí)間:2023年08月11日 14:16:53   作者:zxbylx  
這篇文章主要為大家介紹了解決Python3 struct報(bào)錯(cuò)argument for 's' must be a bytes object方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

錯(cuò)誤

在用python3進(jìn)行文件打包二進(jìn)制數(shù)據(jù)的存儲(chǔ)與解析過程中使用struct模塊運(yùn)行下面代碼發(fā)生錯(cuò)誤:

F = open('data.bin', 'wb')
import struct
data = struct.pack('>i4sh', 7, 'spam', 8)
data

報(bào)錯(cuò)信息如下:

error                                     Traceback (most recent call last)
<ipython-input-12-9b7a8e6cf48b> in <module>
1 F = open('data.bin', 'wb')
2 import struct
----> 3 data = struct.pack('>i6sh', 7, 'spam', 8)
4 data
?
error: argument for 's' must be a bytes object

先說解決方案:格式化字符串的值在python的類型是bytes類型,而python3中所有文本都是Unicode,所以需要轉(zhuǎn)換為bytes類型,在'spam'前面加’b'進(jìn)行轉(zhuǎn)換。

F = open('data.bin', 'wb')
import struct
data = struct.pack('>i4sh', 7, b'spam', 8)
data

輸出結(jié)果是:

b'\x00\x00\x00\x07spam\x00\x08'

python3新增的bytes類型

在python2中字節(jié)類型和字符類型區(qū)別不大,但是在python3中最重要的特性是對(duì)文本和二進(jìn)制數(shù)據(jù)做了更加清晰的區(qū)分。

文本總是Unicode,由字符類型表示,而二進(jìn)制數(shù)據(jù)則由bytes類型表示。

python3不會(huì)以任意隱式方式混用字節(jié)型和字符型,也因此在python3中不能拼接字符串和字節(jié)包(python2中可以,會(huì)自動(dòng)進(jìn)行轉(zhuǎn)換),也不能在字節(jié)包中搜索字符串,也不能將字符串傳入?yún)?shù)為字節(jié)包的函數(shù)。

需要注意的是,在網(wǎng)絡(luò)數(shù)據(jù)傳輸過程中,python2可以通過字符串(string)方式傳輸,但是python3只能通過二進(jìn)制(bytes)方式來傳輸,因此要對(duì)傳輸文本進(jìn)行轉(zhuǎn)換。

轉(zhuǎn)化方式:

str → byte 用encode()方法 byte → str 用decode()方法

中文字符串轉(zhuǎn)二進(jìn)制:

'你好'.encode('utf-8')

輸出:

b'\xe4\xbd\xa0\xe5\xa5\xbd'

二進(jìn)制轉(zhuǎn)回字符串:

b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8')

輸出:'你好'

英文字符串轉(zhuǎn)二進(jìn)制

'hello world'.encode('utf-8')

輸出:

b'hello world'

encode()和decode()方法中默認(rèn)編碼為utf-8,但是為了避免錯(cuò)誤,最好將編碼加上。

僅僅知道加'b'可以解決問題但是感覺還是不夠,'>i4sh'看不懂,所以去官方文檔查struct看到結(jié)果如下:

struct.pack(format, v1, v2, ...) 返回一個(gè) bytes 對(duì)象,其中包含根據(jù)格式字符串 format 打包的值 v1, v2, ... 參數(shù)個(gè)數(shù)必須與格式字符串所要求的值完全匹配。

可以看出i對(duì)應(yīng)的是python中的整數(shù),s對(duì)應(yīng)的是字符串,h對(duì)應(yīng)的是整數(shù)。

格式字符之前可以帶有整數(shù)重復(fù)計(jì)數(shù)。 例如,格式字符串 '4h' 的含義與 'hhhh' 完全相同。

所以測(cè)試了一下,在h前加數(shù)字2:

F = open('data.bin', 'wb')
import struct
data = struct.pack('>i4s2h', 7, b'spam', 8)
data

報(bào)錯(cuò)如下:

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-33-a27281e58db6> in <module>
1 F = open('data.bin', 'wb')
2 import struct
----> 3 data = struct.pack('>i4s2h', 7, b'spam', 8)
4 data
?
error: pack expected 4 items for packing (got 3)

也是就說2h就需要在s后面有2個(gè)整數(shù)參數(shù),但是'4s'卻不是需要四個(gè)bytes參數(shù)。

對(duì)于 's' 格式字符,計(jì)數(shù)會(huì)被解析為字節(jié)的長(zhǎng)度,而不是像其他格式字符那樣的重復(fù)計(jì)數(shù);例如,'10s' 表示一個(gè) 10 字節(jié)的字節(jié)串,而 '10c' 表示 10 個(gè)字符。 如果未給出計(jì)數(shù),則默認(rèn)值為 1。 對(duì)于打包操作,字節(jié)串會(huì)被適當(dāng)?shù)亟財(cái)嗷蛱畛淇兆止?jié)以符合要求。

所以做了個(gè)測(cè)試,先后將s前的數(shù)字從1慢慢漲到6得到的輸出結(jié)果如下:

b'\x00\x00\x00\x07s\x00\x08'               #'>i1sh'
b'\x00\x00\x00\x07sp\x00\x08'             #'>i2sh'
b'\x00\x00\x00\x07spa\x00\x08'             #'>i3sh'
b'\x00\x00\x00\x07spam\x00\x08'           #'>i4sh'
b'\x00\x00\x00\x07spam\x00\x00\x08'       #'>i5sh'
b'\x00\x00\x00\x07spam\x00\x00\x00\x08'   #'>i6sh'

在數(shù)字小于后面字節(jié)長(zhǎng)度時(shí)會(huì)截取,超過長(zhǎng)度時(shí)會(huì)在后面填充空字節(jié)。

以上就是解決Python3 struct報(bào)錯(cuò)argument for 's' must be a bytes object的詳細(xì)內(nèi)容,更多關(guān)于Python3 struct報(bào)錯(cuò)解決的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python asyncore socket客戶端實(shí)現(xiàn)方法詳解

    Python asyncore socket客戶端實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Python asyncore socket客戶端實(shí)現(xiàn)方法,asyncore庫(kù)是python的一個(gè)標(biāo)準(zhǔn)庫(kù),提供了以異步的方式寫入套接字服務(wù)的客戶端和服務(wù)器的基礎(chǔ)結(jié)構(gòu)
    2022-12-12
  • Python優(yōu)先隊(duì)列實(shí)現(xiàn)方法示例

    Python優(yōu)先隊(duì)列實(shí)現(xiàn)方法示例

    這篇文章主要介紹了Python優(yōu)先隊(duì)列實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python優(yōu)先隊(duì)列的具體定義與使用方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2017-09-09
  • python中pycryptodome模塊實(shí)現(xiàn)加密算法庫(kù)

    python中pycryptodome模塊實(shí)現(xiàn)加密算法庫(kù)

    PyCryptodome提供了許多密碼學(xué)算法和協(xié)議的實(shí)現(xiàn),包括對(duì)稱加密、非對(duì)稱加密、消息摘要、密碼哈希、數(shù)字簽名等,本文主要介紹了python中pycryptodome模塊實(shí)現(xiàn)加密算法庫(kù),感興趣的可以了解一下
    2023-11-11
  • Python調(diào)用Tika實(shí)現(xiàn)一站式提取PDF/Word/Excel

    Python調(diào)用Tika實(shí)現(xiàn)一站式提取PDF/Word/Excel

    Apache?Tika是一款強(qiáng)大的開源內(nèi)容分析工具,支持1000多種文件格式的統(tǒng)一解析,本文將從零開始,帶你全面掌握Apache?Tika的環(huán)境搭建,Python調(diào)用,元數(shù)據(jù)提取,掃描件OCR和內(nèi)嵌附件解析
    2026-04-04
  • 零基礎(chǔ)寫python爬蟲之使用urllib2組件抓取網(wǎng)頁(yè)內(nèi)容

    零基礎(chǔ)寫python爬蟲之使用urllib2組件抓取網(wǎng)頁(yè)內(nèi)容

    文章詳細(xì)介紹了在python2.5環(huán)境下,如何使用urllib2這個(gè)python自帶的組件進(jìn)行抓取指定網(wǎng)頁(yè)內(nèi)容的,整個(gè)過程記錄的非常的詳細(xì),也很簡(jiǎn)單,有需要的朋友可以參考下,寫出自己的python爬蟲
    2014-11-11
  • Python3二分查找?guī)旌瘮?shù)bisect(),bisect_left()和bisect_right()的區(qū)別

    Python3二分查找?guī)旌瘮?shù)bisect(),bisect_left()和bisect_right()的區(qū)別

    這篇文章主要介紹了Python3二分查找?guī)旌瘮?shù)bisect(),bisect_left()和bisect_right()的區(qū)別,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Python辦公自動(dòng)化之?dāng)?shù)據(jù)預(yù)處理和數(shù)據(jù)校驗(yàn)詳解

    Python辦公自動(dòng)化之?dāng)?shù)據(jù)預(yù)處理和數(shù)據(jù)校驗(yàn)詳解

    這篇文章主要為大家詳細(xì)介紹了Python辦公自動(dòng)化中數(shù)據(jù)預(yù)處理和數(shù)據(jù)校驗(yàn)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2024-01-01
  • Django框架創(chuàng)建項(xiàng)目的方法入門教程

    Django框架創(chuàng)建項(xiàng)目的方法入門教程

    這篇文章主要介紹了Django框架創(chuàng)建項(xiàng)目的方法,結(jié)合實(shí)例形式分析了Django框架管理工具的使用及創(chuàng)建項(xiàng)目的相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • Python中的pip命令安裝與使用輕松入門教程

    Python中的pip命令安裝與使用輕松入門教程

    pip是Python的包管理工具,用于安裝、卸載和管理第三方庫(kù),本文詳細(xì)介紹了pip的安裝和使用方法,包括檢查pip是否已安裝、手動(dòng)安裝或升級(jí)pip以及pip的基本使用,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • Anaconda配置各版本Pytorch的實(shí)現(xiàn)

    Anaconda配置各版本Pytorch的實(shí)現(xiàn)

    本文是整理目前全版本pytorch深度學(xué)習(xí)環(huán)境配置指令,以下指令適用Windows操作系統(tǒng),在Anaconda Prompt中運(yùn)行,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論

梁平县| 尉犁县| 望奎县| 彩票| 扬中市| 临桂县| 大名县| 香港 | 竹北市| 沙坪坝区| 共和县| 安图县| 邻水| 高阳县| 嘉兴市| 驻马店市| 诸暨市| 泸州市| 锡林浩特市| 湟源县| 陆川县| 奇台县| 临朐县| 哈密市| 伊通| 资兴市| 永善县| 田东县| 汉源县| 仙居县| 定南县| 井冈山市| 扎兰屯市| 沂水县| 井研县| 政和县| 新蔡县| 黑龙江省| 南部县| 揭阳市| 沈丘县|