# 《Python Cookbook（第3版）中文版》——6.11　读写二进制结构的数组

### 6.11.2　解决方案

from struct import Struct
def write_records(records, format, f):
'''
Write a sequence of tuples to a binary file of structures.
'''
record_struct = Struct(format)
for r in records:
f.write(record_struct.pack(*r))

# Example
if __name__ == '__main__':
records = [ (1, 2.3, 4.5),
(6, 7.8, 9.0),
(12, 13.4, 56.7) ]

with open('data.b', 'wb') as f:
write_records(records, '<idd', f)

from struct import Struct
record_struct = Struct(format)
return (record_struct.unpack(chunk) for chunk in chunks)

# Example
if __name__ == '__main__':
with open('data.b','rb') as f:
# Process rec
...

from struct import Struct
def unpack_records(format, data):
record_struct = Struct(format)
return (record_struct.unpack_from(data, offset)
for offset in range(0, len(data), record_struct.size))
# Example
if __name__ == '__main__':
with open('data.b', 'rb') as f:
for rec in unpack_records('<idd', data):
# Process rec
...

### 6.11.3　讨论

# Little endian 32-bit integer, two double precision floats
record_struct = Struct('<idd')

>>> from struct import Struct
>>> record_struct = Struct('<idd')
>>> record_struct.size
20
>>> record_struct.pack(1, 2.0, 3.0)
b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@'
>>> record_struct.unpack(_)
(1, 2.0, 3.0)
>>>

>>> import struct
>>> struct.pack('<idd', 1, 2.0, 3.0)
b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@'
>>> struct.unpack('<idd', _)
(1, 2.0, 3.0)
>>>

>>> f = open('data.b', 'rb')
>>> chunks = iter(lambda: f.read(20), b'')
>>> chunks
<callable_iterator object at 0x10069e6d0>
>>> for chk in chunks:
...      print(chk)
...
b'\x01\x00\x00\x00ffffff\x02@\x00\x00\x00\x00\x00\x00\x12@'
b'\x06\x00\x00\x00333333\x1f@\x00\x00\x00\x00\x00\x00"@'
b'\x0c\x00\x00\x00\xcd\xcc\xcc\xcc\xcc\xcc*@\x9a\x99\x99\x99\x99YL@'
>>>

def read_records(format, f):
record_struct = Struct(format)
while True:
if chk == b'':
break
yield record_struct.unpack(chk)
return records

def unpack_records(format, data):
record_struct = Struct(format)
return (record_struct.unpack(data[offset:offset + record_struct.size])
for offset in range(0, len(data), record_struct.size))

from collections import namedtuple
Record = namedtuple('Record', ['kind','x','y'])
with open('data.p', 'rb') as f:
records = (Record(*r) for r in read_records('<idd', f))
for r in records:
print(r.kind, r.x, r.y)

>>> import numpy as np
>>> f = open('data.b', 'rb')
>>> records = np.fromfile(f, dtype='<i,<d,<d')
>>> records
array([(1, 2.3, 4.5), (6, 7.8, 9.0), (12, 13.4, 56.7)],
dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', '<f8')])
>>> records[0]
(1, 2.3, 4.5)
>>> records[1]
(6, 7.8, 9.0)
>>>

|
4天前
|

Python代码结构
【7月更文挑战第16天】Python代码结构
12 2
|
9天前
|

Python图论实战：从零基础到精通DFS与BFS遍历，轻松玩转复杂网络结构
【7月更文挑战第11天】图论在数据科学中扮演关键角色，用于解决复杂网络问题。Python因其易用性和库支持成为实现图算法的首选。本文通过问答形式介绍DFS和BFS，图是节点和边的数据结构，遍历用于搜索和分析。Python中图可表示为邻接表，DFS用递归遍历，BFS借助队列。DFS适用于深度探索，BFS则用于最短路径。提供的代码示例帮助理解如何在Python中应用这两种遍历算法。开始探索图论，解锁更多技术可能！
23 6
|
8天前
|

【7月更文挑战第12天】在Python中，图数据结构通过邻接表实现，如Graph类所示。深度优先搜索（DFS）和广度优先搜索（BFS）是图遍历的关键算法。DFS递归遍历从起点开始的分支，常用于路径查找和连通性检查；BFS使用队列，适用于找最短路径。
15 3
|
6天前
|

openpyxl是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它不需要Microsoft Excel，也不需要.NET或COM组件。
openpyxl是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它不需要Microsoft Excel，也不需要.NET或COM组件。
12 1
|
8天前
|

python的结构
【7月更文挑战第12天】python的结构
6 2
|
9天前
|

【7月更文挑战第11天】在数据结构与算法中，图的遍历如DFS和BFS是解决复杂问题的关键。DFS深入探索直至无路可走，回溯找其他路径，适合找任意解；BFS则逐层扩展，常用于找最短路径。在迷宫问题中，BFS确保找到最短路径，DFS则可能不是最短。Python实现展示了两种方法如何在图（迷宫）中寻找从起点到终点的路径。
11 1
|
24天前
|
JSON 安全 数据格式
Python文件操作宝典：一步步教你玩转文件读写
Python文件操作宝典：一步步教你玩转文件读写
26 3
|
6天前
|

scipy.ndimage是SciPy库中的一个子模块，它提供了许多用于处理n维数组（通常是图像）的函数。
scipy.ndimage是SciPy库中的一个子模块，它提供了许多用于处理n维数组（通常是图像）的函数。
13 0
|
13天前
|

【7月更文挑战第7天】Python中的闭包和装饰器是强大工具。闭包是能记住外部作用域变量的内部函数，常用于动态函数创建和数据封装。装饰器是接收函数并返回新函数的函数，用于在不修改原代码的情况下扩展功能，如日志或性能监控。通过示例展示了如何使用它们优化代码结构和提升效率。掌握这两者，能写出更优雅高效的Python代码。
12 0
|
15天前
|

Pandas是Python数据分析的核心库，基于NumPy，提供DataFrame结构处理结构化数据
【7月更文挑战第5天】Pandas是Python数据分析的核心库，基于NumPy，提供DataFrame结构处理结构化数据。它支持缺失值处理（dropna()、fillna())、异常值检测（Z-Score、IQR法）和重复值管理（duplicated()、drop_duplicates()）。此外，数据转换包括类型转换（astype()）、数据标准化（Min-Max、Z-Score）以及类别编码（get_dummies()）。这些功能使得Pandas成为大数据预处理的强大工具。
16 0