有时候诸如图片、音乐等信息不是以文本的形式存储的,而是二进制文件格式存储的。

有时候很多信息不是以文本文件的形式存储的

很多时候,都需要用到二进制读取文件。毕竟很多信息不是以文本的形式存储。例如:图片,音乐等等。这些东西都是有规则的二进制文件。

1 字节(byte)的单位

1KB = 2*10 Bytes

1MB = 1KB * 1024 = 2**20 Bytes

1GB = 1KB * 1K * 1K = 2**30 Bytes

# 1byte = 8bit(位)

2 二进制文件

二进制文件是以字节(byte) 为单位存储的,

不以换行符(\n)为单位进行区分内容的文件读写方法

二进制是以字节来操作的

文本是以字符来操作的

3 打开模式mode

’ b ‘

注意:"b"(用二进制模式打开)"t"(文本文件模式打开,默认,也即缺省模式)这两个不能同时使用

4 字节串 bytes

字节串也称之为字节序列

存储时以字节为单位的数据

字节串时不可变的字节序列

(如果不好理解,可以参考元组)

字节串一旦创建,不可修改,与元组类似

备注:

字节是0~255(2**8-1)之间的整数(0b11111111, 0b00000000)

字符串存的数是1~65535(2**16-1)之间的数(UNICODE16/UNICODE32)

字节串创建过程中不能有汉字(编码范围限制所致),但可用"utf-8"来实现将字符串转成字节串

5  创建字节串

在非特殊情况下,在创建字符串时,单引号和双引号具有相同的作用

5.1 创建空字节串

创建空字符串有两种方式

方式1:

>>> b = b""
>>> b
b''
>>> B = B""
>>> B
b'' 

方式2:

>>> D = bytes()
>>> D
b''

5.2 创建非空字节串

>>> a = b"ABCD"
>>> b = b"ABCD"
>>> c = b'''ABCD'''
>>> d = b'\x41\x42'
>>> a
b'ABCD'
>>> b
b'ABCD'
>>> c
b'ABCD'
>>> d
b'AB'

6 字节串的构造(创建)函数 bytes

bytes() :创建一个空字节串, 等同于b''
bytes(整型可迭代对象)  : 用可迭代对象初始化一个字节串(数值必须是0~255的整数)
bytes(整数n) : 生成n个值为0的字节串
bytes(字符串, encoding='utf-8')  :用字符串转换编码生成一个字节串

示例

>>> b = bytes(range(0x41,0x41+26))
>>> b
b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

>>> c = bytes(4)
>>> c
b'\x00\x00\x00\x00'

>>> e = bytes("python", 'ascii')
>>> e
b'python'

>>> f = bytes("中文",'utf-8')
>>> f
b'\xe4\xb8\xad\xe6\x96\x87'

7 字节串的运算

+  +=  *   *=

比较运算: <  <=  >  >=  ==  !=

in /not in 运算符

索引 index

切片 slice

8 二进制文件的写操作示例

示例1 (写入)

二进制操作必须时ASCII范围内的数值

f = open("binary_output.txt", 'wb')
r = f.write(b"今天是2018年2月6日")
print("已经写入", r, "个字节")
f.close()

运行

  File "binary_write.py", line 6
    r = f.write(b"今天是2018年2月6日")
               ^
SyntaxError: bytes can only contain ASCII literal characters.

字节中只能包含ASCII范围内的字符

示例 2(写入)

将示例1中的汉字改成纯英文字母

f = open("binary_output.txt", 'wb')
r = f.write(b"ABCDEF")
print("已经写入", r, "个字节")
f.close()

运行:

已经写入 6 个字节
f = open(file_name,"rb+")
data = f.read(1) #这样data是一个b开头的ASCII数字。
f.close()
print(ord(data)) #将二进制数据转化为10进制数据。

代码中的f 是文件流对象,是由顺序的,也称之为字节流

查看字节流的方式xxd file_name。

如查看test.txt文件的字节流,文件内容:ABCabc123

xxd test.py

输出

00000000: 4142 4361 6263                           ABCabc

16进制表示的地址,可以认为是一个列表

00000000(16进制表示的地址): 0a23 20e6 8993 e5bc 80e6 9687 e4bb b6ef # 16字节
      01 02  
00000010: bc8c e8bf 94e5 9b9e e696 87e4 bbb6 e6b5 ................

一次读写都是8个位,也即一个字节

可以用 cat test.txt 方式直接查看 test.txt 文件内容

ls -l test.txt  查看文档的字节数


用count = f.write返回值写入字符数来判断磁盘满是否满

\n的换行是lunix unix系统的

微软的换行是\t\n

在读取或写入时一定要注意\n \t\n之间的差异

在其他平台中,微软的\t\n会被忽略,输出时正常 

w+ 与w 效果一样

硬盘是块  4k为一块

r = f.write(b"aba")在执行程序时并没有将其写入文件中,而是将其存放在缓存中,等足够数量后才写入硬盘,
可以用f.flush来实现操作,这函数功能是倾倒缓存内容,不管缓存中的容量是否够存储条件,均将缓存中的内容写入硬盘中

Python学习笔记015——文件file的常规操作(二进制文件)的更多相关文章

  1. Python学习笔记015——文件file的常规操作之一(文本文件)

    1 什么是文件 文件是用于数据存储的单位 文件通常用来长期保存数据 读写文件是最常见的I/O操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件的功能都是由操作系统提供的,一般而言,操 ...

  2. Python学习笔记015——文件file的常规操作之四(输入重定向)

    windows命令提示符(cmd.exe)和Linux Shell(bash等)均可通过">"或”>>“将输出重定向.其中, ">"表示 ...

  3. Python学习笔记015——文件file的常规操作之三(标准输入输出文件)

    1 标准输入输出文件 在Python中,模块sys中含有标准的输入输出文件 sys.stdin     标准输入方法(一般是键盘) sys.stdout   标准输出方法(到显示器的缓冲输出) sys ...

  4. Python学习笔记015——文件file的常规操作seek()及tell()

    1 seek() 1.1 概述 file.seek()用于将文件游标移动到文件的任意位置,便于对文件的当前位置(增.删.改.查)操作 1.2 语法 fileObject.seek(offset[, w ...

  5. [Python学习笔记]组织文件

    shutil 模块 shutil 模块可以让我们很方便的在Python程序中复制.移动.改名和删除文件. 复制文件和文件夹 使用shutil.copy()来复制文件,该函数含两个参数,均为字符串格式的 ...

  6. Python学习笔记之文件处理

    1.打开和关闭 要打开文件可以使用函数 open(),它位于自动导入模块 io 中.函数将文件名作为唯一不可缺少的函数,并返回一个文件对象.它还有一个名叫 mode 的参数,用于指定文件模式,其可取值 ...

  7. python学习笔记(11):文件的访问与函数式编程

    一.文本文件读写的三种方法 1.直接读入 file1 = open('E:/hello/hello.txt') file2 = open('output.txt','w') #w是可写的文件 whil ...

  8. python学习笔记(7)文件的访问与函数式编程

    一.文件读写的3中方法 1.直接读入 fiel1=open('test.txt') file2=open('output.txt') while True: line=file1.readLine() ...

  9. Python学习笔记 - day5 - 文件操作

    Python文件操作 读写文件是最常见的IO操作,在磁盘上读写文件的功能都是由操作系统提供的,操作系统不允许普通的程序直接操作磁盘(大部分程序都需要间接的通过操作系统来完成对硬件的操作),所以,读写文 ...

随机推荐

  1. 混沌数学之拉比诺维奇-法布里康特方程(Rabinovich-Fabrikant equations)

    拉比诺维奇-法布里康特方程(Rabinovich-Fabrikant equations)是 1979年苏联物理学家拉比诺维奇和法布里康特提出模拟非平衡介 质自激波动的非线性常微分方程组: dot{x ...

  2. Java 连接MS Access数据库

    java连接MS Access的两种方式: 1.JDBC-ODBC Java连接Access可以使用MS自带的管理工具-->数据源(ODBC)设置建立连接,这样就不需要导入jar.但是,如此一来 ...

  3. Jquery 获取第一个子元素

    <ul>  <li>John</li>  <li>Karl</li>  <li>Brandon</li></u ...

  4. NYOJ-61 传纸条(一)

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...

  5. BSTR

    BSTR A BSTR (Basic string or binary string) is a string data type that is used by COM, Automation, a ...

  6. W3CSchool CSS学习简记

    什么是 CSS?   CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内 ...

  7. git 使用流程(使用代码库github)

    一:先在github 上注册账号,并创建一个项目: 二:mac 命令行-进入自己的工作空间 1:建立库     git init 2:初始化配置 git config --global user.na ...

  8. Speculative Execution in Hadoop

    来自:http://blog.csdn.net/macyang/article/details/7880671 所谓的推测执行,就是当所有task都开始运行之后,Job Tracker会统计所有任务的 ...

  9. Closing a window

    The obvious way to how to close a window is to click on the x mark on the titlebar. In the next exam ...

  10. COCOS学习笔记--粒子系统

    一.粒子系统的简单介绍 粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象.物理现象及空间扭曲上具备得天独厚的优势,为我们实现一些真实自然而又带有随机性的特效(如爆炸.烟花.水流)提供了方 ...