Day16笔记
文件file
作用 | 文件是用于数据存储的单位 |
文件通常用来长期存储数据 | |
文件中的数据是以字节为单位进行顺序存储 | |
文件的操作流程 | 1. 打开文件 |
2. 读/写文件 | |
3. 关闭文件 | |
注:任意的操作系统吗,同一个应用程序同时打开文件的数量有最大数限制,所以在用完文件后需关闭 | |
文件的打开函数 open | Open(file,mode=‘rt’)用于打开一个文件,返回此文件流对象,如果打开文件失败,则会触发OSError错误 |
文件的关闭方法 | F.close() 关闭文件,释放系统资源 |
示例
| # 此示例示意文件的打开,读取及关闭
# 第一步打开文件 try: f = open('myfile.txt', 'rt') # f = open('/aaaaaaaaaa.txt', 'rt') print("打开文件成功!")
# 第二步读取文件 s = f.read() # 读取全部内容形成字符串用s绑定 print("文件中的内容是:", s)
# 第三步,关闭文件 f.close() print("文件已关闭") except OSError: print("文件打开失败") |
文本文件操作模式 | 模式字符:‘t’(默认) 1.默认文件中存储的数据为字符数据,以行尾单位分隔,在Python内部同于用‘\n’作为换行符进行分隔 |
2.对文本文件的读写需要用字符串(str)进行读取和写入数据 | |
各操作系统的换行符: | 1.Linux换行符 :‘\n’’ |
2.Windows换行符:‘\r\n’ | |
3.旧的Macintosh换行符:‘\r’ | |
4.新的Mac OS换行符:‘\n’ | |
说明: | 在文件模式下,各操作系统的换行符在读入python内部转换为‘\n’ |
练习:
自己写一个文件 info.txt,内部存储一些文字信息如下:
小张 20 100
小李 18 98
小王 19 95
写程序将这些数据读取出来,打印在屏幕终端上
解:
def read_file_content():
L = []
try:
f = open('info.txt')
while True:
s = f.readline() # '小张 20 100\n'
if not s:
break
s2 = s.strip() # '小张 20 100'
name_age_score = s2.split() # ['小张', '20', '100']
n, a, s = name_age_score
d = {'name': n, 'age': int(a), 'score': s}
# d = {'name': '小张', 'age': 20, 'score': 100}
L.append(d)
f.close()
except OSError:
print('打开文件失败')
return L
if __name__ == '__main__':
docs = read_file_content()
print(docs)
字符 | 含义 |
'r' | 以只读方式打开(默认) |
'w' | 以只写方式打开,删除原有文件内容(如果文件不存在,则创建该文件并以只写方式打开) |
'x' | 创建一个新文件, 并以写模式打开这个文件,如果文件存在则会产生"FileExistsError"错误 |
'a' | 以只写文件打开一个文件,如果有原文件则追加到文件末尾 |
'b' | 用二进制模式打开 |
't' | 文本文件模式打开 (默认) |
'+' | 为更新内容打开一个磁盘文件 (可读可写) |
文件的迭代读取 | open 返回的文件流对象是可迭代对象 |
示例:
| f = open(‘myfile.txt’) for line in f: print(line) |
文本文件的写操作: | 写文件模式有: w x a |
示例:
| f = open("mynote.txt","w")#以写模式打开文件 f.write("您好") #只能写一个字符串 f.write("中国!") f.write("\n") f.write("hello china!") f.writelines(['aaaa\n','bbbb\n','cccc']) #可以写一系列的字符 f.close() |
练习:
1.写一个程序,输入很多人的姓名,年龄,家庭住址信息,存入文件infos。Txt中
文件格式字节定义
完后输入后查看文件格式是否是你想要的格式(文本文件操作)
解:
file = open('3infos.txt', 'w')
while True:
n = input("请输入姓名: ")
if n == '':
break
a = int(input('请输入年龄: '))
addr = input("请输入住址: ")
# 写入到文件中:
file.write(n)
file.write(',')
file.write(str(a))
file.write(',')
file.write(addr)
file.write('\n')
file.close()
2.写一个程序读入infos.txt中的内容,以如下格式打印infos.txt中的内容
姓名:xxx 年龄:20 住址:xxxx
姓名:yyy 年龄:18 住址:YYYY
file = open('3infos.txt', 'rt')
for line in file:
s = line.strip() # 去掉左右的空白字符
lst = s.split(',')
# print(lst)
n, a, addr = lst # 序列赋值
a = int(a) # 将年龄转为整数
print('姓名: %s, 年龄: %d, 住址: %s' % (n, a, addr))
file.close()
二进制文件操作
作用 | 1.默认的文件中存储的都是以字节为单位的数据 | |
2.通常有人为规则的格式,需要一字节为单位 | ||
F.read()的返回类型 | 1.对于文本模式(‘t’)打开的文件,返回字符串(str) | |
2.对于二进制模式(‘b’)打开的文件,返回字节串(bytes) | ||
F.write(x) | 1.对于文本模式,x必须为字符串 | |
2.对于二进制模式,x必须为字节串 | ||
以十六进制方式查看文件内容的命令: | $ xxd 文件名 | |
示例
| 写入数据 try: f = open('data.bin', 'wb') print('打开文件成功') #写入数据 b = b'\xe4\xb8\xad' f.write(b)
f.close() except OSError: print('打开文件失败!') | 读取文件字节 file =open('data.bin','rb') b = file.read(1)#读取一个字节 print('第一个字节为:',b)
b = file.read()#读取所有字节 print('其他所有的字节为:',b) |
练习:
将如下数据用二进制文件操作方式写入到文件date.txt
数据如下:
小李 1388888899
小王 1366666666
提示:b = str.encode(‘utf-8’)
用sublime text3打开,查看写入的内容能否被sublime识别并读取
name1 = '小李'
number1 = 13888888899
name2 = '小王'
number2 = 13666666666
file = open("4date.txt", 'wb')
s = name1 + ' ' + str(number1) + '\n'
b = s.encode('utf-8')
file.write(b) # 写入第一行数据
s = name2 + ' ' + str(number2) + '\n'
b = s.encode('utf-8')
file.write(b) # 写入第二行数据
file.close()
F.seek()方法
作用 | 改变当前文件的读写位置 |
偏移量 | 相对位置 |
大于0的数代表向文件尾方向移动 小于0代表向文件方向移动 | 0 代表从文件头开始偏移 1 代表从当前位置开始偏移 2 代表从文件尾开始偏移 |
示例 |
f = open('4myfile.bin', 'rb') print("刚打开文件时,文件的读写位置是:", f.tell()) #0
b = f.read(2) print('刚读入的内容是:', b) print('读取两个字节后的读写位置是:', f.tell()) # 2
# 想读取第五个字节开始的5个字节 # 定位 # f.seek(5, 0) # 从头开始向后移动5个字节的位置 # f.seek(3, 1) # 从当前的读写位置向后移动3个字节的位置 f.seek(-15, 2) # 从文件尾向前移动15个字节的位置
print("seek 移动后的读写位置是:", f.tell()) # 5 b = f.read(5) # 读取5个字节 print(b) # b'abcde'
f.close()
|
F.tell()函数
作用 | 返回当前文件读写位置 |
示例
| f = open('4myfile.bin', 'rb') print("刚打开文件时,文件的读写位置是:", f.tell()) #0
b = f.read(2) print('刚读入的内容是:', b) print('读取两个字节后的读写位置是:', f.tell()) # 2
# 想读取第五个字节开始的5个字节 # 定位 # f.seek(5, 0) # 从头开始向后移动5个字节的位置 # f.seek(3, 1) # 从当前的读写位置向后移动3个字节的位置 f.seek(-15, 2) # 从文件尾向前移动15个字节的位置
print("seek 移动后的读写位置是:", f.tell()) # 5 b = f.read(5) # 读取5个字节 print(b) # b'abcde'
f.close()
|
文件操作的两种模式
‘b’ | 二进制模式 |
‘t’ | 文本模式 |
文件操作
读 | read/readline/readlines |
写 | write/writelines |
汉字的编码
国标系列 | 国际标准 |
1.GB18030(二字节或四字节编码,共27533个汉字) 2.GBK(二字节编码,共21003个汉字) 3.GB2312(二字节编码,共6763个汉字) (windows 常用) | 1. UNICODE32(UNICDE16)ßàUTF-8
(Linux,Mac OS X,IOS,Android等常用) |
说明: | Python的字符串内部都是用UNICODE来存储字符的 |
Python 编码(encode)字符串
内容 | (1)‘gb2312’(2)‘gbk’(3)‘gb18030’ (4)‘utf - 8’(4)‘ASCII’ |
编码注释
作用
| (1)在python源文件第一行或第二行写入如下内容是告诉解释执行器此文件的编码类型是什么。 |
(2)如:# -*- coding: gbk -*- #设置源文件编码格式 | |
示例 | # -*- coding: gbk -*- print("你好!")
# 此示例示意gbk编码的源文件加上编码注释后 # 可以在python3下运行 |
练习:
1. 写程序实现复制文件功能:
要求:
1)多大的文件都能复制
2)要能复制二进制文件
3)要考虑关闭文件
如:
请输入源文件:../day15.tar.gz
请输入目录文件:abc.tar.gz
以复制文件,文件长度是:…
2. 为学生信息管理项目添加两个功能
|9)保存学生信息到文件(si.txt) |
|10)从文件中读取学生数据(si.txt)|
要求:
(每个功能只要有一个函数与之相对应)