问题

你想在一个文件里每次读入固定大小的字节,比如每次读入4个字节并转成int,或者每次读入x个字节并进行结构化,例如:

l = [5, 2, 4, 1, 2, 4, 5, 6, 8]

with open('test', 'wb') as fd:

for num in l:

fd.write(num.to_bytes(4, 'big'))

解决方案

可以简单的用while循环来完成

with open('test', 'rb') as fd:

r = fd.read(4)

while r:

print(int.from_bytes(r, 'big'), end=' ')

r = fd.read(4)

输出为5 2 4 1 2 4 5 6 8

但更优雅的做法是结合使用iter和functools.partial

from functools import partial

with open('test', 'rb') as fd:

for r in iter(partial(fd.read, 4), b''):

print(int.from_bytes(r, 'big'), end=' ')

输出同样是5 2 4 1 2 4 5 6 8

讨论

functools.partial的作用是对一个函数进行包装(可以将一些参数的值固定)并生成一个新的签名,例如:

>>> from functools import partial

>>> basetwo = partial(int, base=2)

>>> basetwo.__doc__ = 'Convert base 2 string to an int.'

>>> basetwo('10010')

18

functools.partial的大致实现如下:

def partial(func, *args, **keywords):

def newfunc(*fargs, **fkeywords):

newkeywords = keywords.copy()

newkeywords.update(fkeywords)

return func(*args, *fargs, **newkeywords)

newfunc.func = func

newfunc.args = args

newfunc.keywords = keywords

return newfunc

而iter的作用是当只有一个参数时,对这个对象进行迭代,所以这个对象必须实现__iter()__或__getitem()__方法,例如:

>>> l = [1, 2, 3, 4]

>>> for i in iter(l):

... print(i, end=' ')

...

>>> 1 2 3 4

但当有两个参数时,第一个参数必须是可调用的(比如函数),第二个参数是终止的值,当调用第一个参数返回的结果等于第二个参数时,迭代就停止了,例如:

with open('mydata.txt') as fp:

for line in iter(fp.readline, ''):

process_line(line)

所以综合两个方法来看上面的iter(partial(fd.read, 4), b''),就是每次调用fd.read(4)直到返回一个空的bytes

来源

Python Cookbook

关注

欢迎关注我的微信公众号:python每日一练

python 编程一日一练-Python每日一练0022相关推荐

  1. python编程在哪里写-python入门该从哪里开始?

    相信对于每个人而言,知道编程和学习编程这件事,出发点是不同的.汤哥在北京接触编程的时间是2013年,那个时候还在一个二线城市上大学,还没有这么多各种融资,各种互联网创业的氛围,大家想的更多的是一些线下 ...

  2. python编程方式_自学python编程的方法路线

    怎么自学python编程 如何自学Python编程?一堆的Python教程却感觉无从下手呢?我想这应该是很多Python初学者正在纠结的问题. 今天想要分享给大家的是如何自学Python编程,学习这件 ...

  3. python编程300集免费-python 300本电子书合集

    链接: https://pan.baidu.com/s/1CNlB35ASnDNlUGNCZJbiAA 提取码: fxig Q群:592857363 更多所在 数据科学速查表 零起点Python机器学 ...

  4. python编程输入标准-揭秘python编程技巧

    揭秘python编程技巧 一.python的标准输入和输出[root@133 wc]# vim stdin.py #!/usr/bin/python #encoding:utf-8 import sy ...

  5. python编程入门-Python编程入门经典pdf(Python编程入门教程) 高清中文版

    Python编程入门经典pdf(Python编程入门教程)下载.Python编程入门经典pdf高清版帮助各位更好的进行Python编程的学习以及理解,最经典的课题,最深入的概念,让你在Python编程 ...

  6. python开发cs程序_CSE209代做、代写Computer Graphics、代做CS/python编程设计代写Python程序|代做Processing...

    CSE209代做.代写Computer Graphics.代做CS/python编程设计代写Python程序|代做ProcessingCSE209 Computer Graphics~1~CSE209 ...

  7. Python编程好学吗 为什么Python如此受欢迎

    Python编程好学吗?为什么Python如此受欢迎?Python的包装能力.可组合性.可嵌入性都很好,可以把各种复杂性包装在Python模块里,暴露出漂亮的接口.因此,Python自然是大受欢迎. ...

  8. 手机版python编程软件下载,手机python编程软件

    1.求 python 64位安装包下载 软件介绍: python是一款面向对象.解释型.动态数据类型的高级编程设计语言.它拥有语言上的简洁性.可读性和易维护性,在图形处理.数学处理.文本处理.系统编程 ...

  9. 树莓派python编程优点_树莓派为什么会使用python编程?为什么有时python运行效率不高?...

    在许多编程语言中,Python的语法也有很大不同.Python使用空格或缩进来分隔不同的代码块.C语言和其他语言使用花括号来区分不同的代码块,例如if语句,Python使用冒号和缩进来定义代码块.这也 ...

  10. python 编程一日一练-python每日一练

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 过滤掉列表中的负数 筛选出字典{lilei: 79,jim: 88,lu ...

最新文章

  1. 肖仰华:知识图谱落地,不止于“实现”
  2. PWA之push服务
  3. 有人质疑面向对象编程?
  4. python画函数曲线-Python 绘制你想要的数学函数图形
  5. CentOS 7 用yum安装 MySQL
  6. HDU - 6082 度度熊与邪恶大魔王(背包变式)
  7. leetcode 202. 快乐数 思考分析(哈希集合与双指针解)
  8. Android开发技术周报 Issue#72
  9. SQLite3扩展C API
  10. mysql导vertica_vertica系列:数据的导入导出
  11. “网页上有错误”的解决方法
  12. System.ComponentModel.Win32Exception (0x80004005):拒绝访问。——解决办法
  13. MIUI刷第三方rec教程(回退系统)
  14. 惠普安装linux系统u盘,怎么用U盘安装linux系统
  15. 软件测试的各种技术你知道吗?
  16. 三、使用HM进行简单的视频隐写demo
  17. HTML常见的扩展名,HTML文件通常带有.html或.htm的文件扩展名
  18. 计算机什么课学mcmc,MCMC案例学习
  19. linux eap网络,linux – 定期无法连接到WPA2-EAP接入点
  20. flask中的所有第三方模块大集合

热门文章

  1. 第11章:MongoDB-CRUD操作--文档--查询
  2. 灵光一现的trick
  3. 今天决定写一篇LNMP的深入调优,
  4. 系统重装 如何转换GPT的磁盘格式为MBR或者反过来
  5. uva1471 二叉搜索树
  6. HTML5与jQuery实现渐变绚丽网页图片效果
  7. JQuery.validate中文API
  8. .CS文件编译生成.DLL文件 .EXE文件(C#网络搜集)(转)
  9. shell学习(17)- shell中21的解释及输入输出重定向
  10. CF Gym102028G Shortest Paths on Random Forests