第三部分 文件和数据
3.1 文件的使用
3.1.1 文件的类型
文件的理解:文件是数据的抽象和集合
- 文件是存储在辅助存储器上的数据序列
- 文件是数据存储的一种形式
- 文件展现形态:文本文件和二进制文件
对比:文本文件 vs 二进制文件
- 文本文件和二进制文件只是文件的展示方式
- 本质上所有文件都是二进制形式存储
- 形式上所有文件采用两种方式展示
例:有“f.txt”文件中保存内容“中国是个伟大的国家”,以不同形式打开
错误原因
Traceback (most recent call last):
File “E:/A_Vacant/A_Documentation/Python/file_type_test.py”, line 2, in < module >
print(tf.readline())
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xad in position 2: illegal multibyte sequence
文本文件打开没有指明编码方式!
正确示例:
- 文本形式打开文件
- 二进制形式打开文件
3.1.1.1 文本文件
文件是数据的抽象和集合
-
由单一特定编码组成的文件,如UTF-8编码
-
由于存在编码,也被看成是存储着的长字符串
-
适用于例如:.txt文件、.py文件
※知识拓展:由于ASCII码是针对英语设计的,对于一些亚洲、非洲、中东文字及符号无法表示,因此便出现了几乎覆盖所有语言的Unicode编码。但是对于可以用ASCII表示的字符用Unicode并不高效,因为Unicode比ASCII占用大一倍空间,并且高字节的0对它来说毫无用处。而UTF是介于ASCII和Unicode之间的字符集,即通用转换格式,很好地解决了这个问题。
3.1.1.2 二进制文件
文件是数据的抽象和集合
- 直接由比特0和1组成,没有统一字符编码
- 一般存在二进制0和1的组织结构,即文件格式
- 适用于例如:.png文件、.avi文件
数据库文件、图像文件、可执行文件、音视频文件、Office文档均属于二进制文件。
二进制文件不能使用记事本或其他文本编辑软件正常读写,也无法通过Python的文件对象直接读取和理解二进制文件的内容。
因此,必须正确理解二进制文件结构和序列化规则,才能准确地理解其中内容并且设计正确的反序列化规则。
序列化:
简单地说就是把内存中的数据在不丢失其类型信息的情况下转成对象的二进制形式的过程,对象序列化后的形式经过正确的反序列化过程应该能够准确无误地恢复为原来的对象。
python中常用的序列化模块:struct、pickle、json、marshal和shelve。
3.1.2 文件的打开和使用
文件处理的步骤:打开-操作-关闭
- 文件的打开
- 文件路径
- 打开模式
- 文件的关闭
<变量名>.close()
★★★★★上述是打开以及关闭文件的基本方法,但是,更推荐使用👇:
with open(<文件名>) as <文件句柄>:
'''文件处理'''
用途:关键字with可以自动管理资源,不论何种原因跳出with块,总能保证文件被正确关闭,并且可以在代码执行完毕后自动还原进入该代码块时的现场。
传统方法中,若程序存在bug,则将导致close()不会执行,可能造成问及拿数据丢失!!!
3.1.3 文件内容的读取
操作方法:
-
.read(size=-1) —— 读入全部内容,如果给出参数,读入前size长度
>>> f = open("f.txt", "r", encoding="utf-8") >>> s = f.read(2) >>> s '中国'
-
.readline(size=-1) —— 读入一行内容,如果给出参数,读入该行前size长度
>>> f = open("f.txt", "r", encoding="utf-8") >>> s = f.readline() >>> s '中国是个伟大的国家!'
-
.readlines(hint=-1) —— 读入文件所有行,以每行为字符串元素形成列表。如果给出参数,读入前hint行
>>> f = open("f.txt", "r", encoding="utf-8") >>> s = f.readlines() >>> s ['中国是个伟大的国家!']
- 文件的全文本操作
- 文件的逐行操作
- 文本处理技巧记录:
要去除文本中序号所有“(…)”括号以及括号内的内容,如"(1)" “(2)”……for line in fi: for i in range(50) line = line.replace("({})".format(i), "")
3.1.4 数据的文件写入
操作方法:
-
.write(s) —— 向文件写入一个字符串或字节流
>>> f = open("f.txt","w") >>> f.write("中国是一个伟大的国家!") 11 >>> f.close()
使用write方法进行写操作时,若循环写入,字符串与字符串之间连续,无间隔符! -
.writelines(lines) —— 将一个元素全为字符串的列表写入文件
>>> f = open("f.txt","w") >>> ls = ["中国", "法国", "美国"] >>> f.writelines(ls) >>> f.close()
-
.seek(offset[,whence]) —— 改变当前文件操作指针位置,offset:表示相对于whence的位置。whence:0—文件开头 1—当前位置 2—文件结尾,默认为0。mmmmmmmmmmmmark
>>> f = open("f.txt","w") >>> f.seek(2) 2 >>> f.write("end") 3 >>> f.close() p161
小练习:
>>> f = open("f.txt","w")
>>> ls = ["中国", "法国", "美国"]
>><