2018.7.23
day15回顾
迭代器
得到迭代器
iter(x),返回一个访问x的迭代器
从迭代器it中拿数据
next(it)
两种生成器:
生成器函数:
生成器函数里一定有 yiled 语句
next(it)每次调用,生成器函数才会执行
生成器表达式:
(表达式 for 变量 in 可迭代对象 if 真值表达式)
迭代工具函数:
zip(可迭代对象1,可迭代对象2,...)
enumerate(可迭代对象,strat=0)
序列:
字节串bytes,字节数组bytearray
day16
问题:
如何长期保存计算机中的数据
需要用文件操作
文件File
文件是用于数据存储和单位
文件通常用来长期存储数据
文件中的数据是以字节为单位进行顺序存储的
文件的操作流程:
1,打开文件
2,读/写文件
3,关闭文件
注:
任何的操作系统,一个应用程序同时打开文件的数量有最大数限制
文件的打开函数
open(file,mode='rt') 用于打开一个文件,返回此文件流对象,
如果打开文件失败,则会触发OSError错误
文件的关闭方法
F.close() #关闭文件,释放系统资源
示例:
# 此示例示意文件的打开和关闭操作
try:
f = open('./aaa.txt') # 不存在此文件
# f = open('./myfile.txt') # 不存在此文件
print("打开文件成功")
# 此处要进行读/写操作
f.close() # 关闭文件
except OSError:
print("文件打开失败")
示例2:
#myfile.txt
#ABCD中
#hello
#world
#上面是txt文档
# 此示例示意文件的打开和 '读' 操作
try:
f = open('./myfile.txt')
print("打开文件成功")
# 此处要进行读操作
s = f.read() # 读取全部的内容,形成字符串用s绑定
print("读取到", len(s), '个字符')
print("内容是: ", s)
f.close() # 半闭文件
except OSError:
print("文件打开失败")
示例3:
# file_read_binary.py
f = open('py.tar.gz', 'rb') # 'b' 二进制模式
b = f.read(4)
print('b的类型是:', type(b))
print("b的内容是:", b)
f.close()
示例4:
#myfile.txt
#ABCD中
#hello
#world
#上面是txt文档,输入电脑去掉#
## 此示例示意文件的打开和 '读' 操作
try:
f = open('./myfile.txt')
print("打开文件成功")
# 此处要进行读操作
s = f.readline() # 读取一行数据,当读取的'\n'就返回
print("len(s)=", len(s))
print('s:', s)
s = f.readline() # 读取第二行
print("第二行:", s)
s = f.readline() # 读取第三行
print("第三行:", s)
s = f.readline() # 只能读取空字符串(表示已经到达文件尾)
if s == '':
print("--------已到达文件尾---------")
f.close() # 半闭文件
except OSError:
print("文件打开失败")
示例5:
#myfile.txt
#ABCD中
#hello
#world
#上面是txt文档,输入电脑去掉#
# 此示例示意文件的打开和用 readlines '读' 操作
try:
f = open('./myfile.txt')
print("打开文件成功")
# 此处要进行读操作
L = f.readlines()
print("L=", L)
f.close() # 半闭文件
except OSError:
print("文件打开失败")
示例6:
#mynote.txt
#中文中文中文中文
#上面是txt文档
# 此示例示意文本文件的写操作
try:
f = open('mynote.txt', 'w') # 'w'代表只写模式
print("文件打开成功")
# f.write('hello')
# f.write('world')
# f.write("你好")
f.write("中文")
f.close()
except OSError:
print("打开文件失败!")
示例7:
# 此示例示意以二进制文件操作方式进行写文件
f = open('mybinary.bin', 'wb')
b = bytes(range(0, 256))
print("字节串的内容是:", b)
f.write(b) # 写入256个字节
f.close() # 关闭文件
示例8:
#mynote2.txt
#你好tarenaabc
#上面是txt文档
# 此示例示意文本文件的写操作
try:
f = open('mynote2.txt', 'w') # 'w'代表只写模式
print("文件打开成功")
L = ['你好', 'tarena', 'abc']
f.writelines(L)
f.close()
except OSError:
print("打开文件失败!")
文本文件操作:
操作模式:
说明:
- 默认文件中存储的都为字符数据,在读写过程中会自动进行编解码操作
- 文本文件以行为单位进行分隔,在python内部统一用'\n' 作用为转行符进行分隔
- 对文本文件的读写操作需要用字符串(str)进行数据操作
各操作系统的换行符
环境 | 换行符 |
---|---|
Linux | ‘\n’ |
Windows | ‘\r\n’ |
旧的Macintosh | ‘\r’ (已经不用了) |
新的Mac OS | ‘\n’ |
查看python 文件常用方法:点击
练习:
1,自己写一个文件'info.txt' 内部存一些文字信息
如:
张三 20 100
李四 21 96
小王 22 98
写程序将这些程序兑取出来,打印到终端上
info.txt
张三 20 100
李四 21 96
小王 22 98
#上面是info.txt文档
#方法一
try:
f = open('info.txt')
L = f.readlines()
for line in L:
s = line.strip()
n, a, s = s.split() # 拆成列表
a = int(a)
s = int(s)
print("姓名:", n, '年龄:', a, '成绩:', s)
# print()
f.close()
except OSError:
print("打开文件失败")
#方法二
try:
f = open('info.txt')
while True:
line = f.readline() # 读取一行
if line == '':
break # 已经到行尾,结束处理
s = line.strip()
n, a, s = s.split() # 拆成列表
a = int(a)
s = int(s)
print("姓名:", n, '年龄:', a, '成绩:', s)
# print()
f.close()
except OSError:
print("打开文件失败")
2,写程序,循环输入很多个人的姓名,电话号码,当输入结束后将这些信息存入到phonenumber.txt中
(建议先用列表暂存数据,格式自己定义)
def get_numbers():
L = []
while True:
n = input("请输入姓名: ")
if n == '':
break
number = input('请输入电话号码: ')
L.append((n, number))
return L
def save_to_file(lst, filename='phonenumber.txt'):
f = open(filename, 'w')
for n, number in lst:
f.write(n)
f.write(',')
f.write(number)
f.write('\n')
f.close() # 关闭文件
L = get_numbers()
print(L)
save_to_file(L)
3,写程序,将phonenumber.txt文件中的数据读取出来,在用以下格式打印出来:
如:小张 的电话 是 1388888888
小李 的电话 是 1399999999
#phonenumber.txt
#小张,13488888888
#小李,13999999999
#练习2生成的txt文档
def read_from_file(filename='phonenumber.txt'):
L = []
f = open(filename)
while True:
s = f.readline()
# 判断是不是到文件尾
if s == '':
break
s = s.strip() # 去掉换行
n, number = s.split(',') # 切为字符串列表
L.append((n, number))
return L
L = read_from_file()
print(L)
for n, number in L:
print(n, '的电话是', number)
文件流对象是可迭代对象,迭代过程中将以换行符'\n' 作为分隔符
示例:
f = open('adsad.txt')
for line in f:
print(line) # 打印每一行的数据
标准输入输出文件:
- sys.stdin 标准输入文件
ctrl+d,文件结束符
- sys.stdout 标准输出文件
- sys.stderr 标准错误输出文件
模块名:sys
注:
标准文件不需要打开和关闭就可以使用
示例见:
import sys
while True:
s = sys.stdin.readline()
if len(s) < 2:
break
print("刚才读入", len(s), '个字符')
print("内容是:", s)
print("程序结束")
示例2:
# stdin.py
import sys
s = sys.stdin.read()
print("s=", s)
print("程序结束")
示例3:
# stdout.py
import sys
sys.stdout.write('hello')
sys.stdout.write(' ')
sys.stdout.write("world!\n")
# sys.stdout.close() # 标准文件不需要关闭
print('这是第二行用print打印的文字')
示例4:
# stderr.py
import sys
sys.stdout.write("我是标准输出\n")
sys.stderr.write("我是一个错误\n")
# 当用
# $ python3 stderr > mystdout.txt 2> err.txt
二进制文件操作:
二进制文件操作模式字符:'b'
默认文件中存储的是以字节为单位数据,通常有人为规定的格式
二进制文件操作需要用字节串进行读写
F.read() / F.readline() / F.readlines() 返回类型
对于文本文件,F.read()等函数返回为字符串(str)
对于二进制文件,F.read()等函数返回为字节串(bytes)
F.write() 对于二进制文件与需要用字节串进行操作
F.tell 方法:
作用:
返回当前的读写位置(从文件头以字节为单位)
F.seek 方法:
作用:
设置读写位置
F.seek(偏移量,whence=相对位置)
偏移量
- 大于0的数代表向文件末尾方向移动的字节数
- 小于0的数代表向文件头方向中移动的字节数
相对位置
- 0代表从文件头开始偏移
- 1代表从文件当前读写位置开始偏移
- 2代表从文件尾开始偏移
示例
f = open('mybinary.bin', 'rb')
f.seek(16, 0)
b = f.read(4) # 读取从16~20的四个字节的内容
print(b)
f.close()
#mybinary.bin 是个文本,里面是一些字节,
示例2:
#myseek.txt
#ABCDEabcde1234567890
#上面是txt文档
# 此示例示意用seek改变文件的读写位置,用tell来得到读写位置
f = open('myseek.txt', 'rb')
b = f.read(2) # b'AB' 读取出来
print(b) # b'AB
# 从头开始向后走5个字节
# f.seek(5, 0)
# 从当前位置向后走3个字节
# f.seek(3, 1)
# 从文件尾向前数15个字节
f.seek(-15, 2)
b = f.read(5)
print(b) # b'abcde'
f.close()
汉字编码(只讲两种)
国标系列:
GB18030 (二字节或四字节编码,共27533个字)
GBK (二字节编码,共21003个字)
GB2312(二字节编码,共6763个汉字)
(windows常用)
国际标准:UNICODE <---> UTF-8
(Linux / Mac OS X / IOS / Android 等常用)
问题:
十个汉字占几个字节
UTF-8: 30个字节
python编码字节串:
- 'gb2312'
- 'gbk'
- 'gb18030'
- 'utf-8'
- 'ascii' 转化英文用的
- ...
以上字符串用于encode和decode中
编码注释:
在python源文件中的第一行或第二行写入如下内容:
#-*- coding:gbk -*-
#设置源文件编码格式为gbk
或
#-*- coding:utf-8 -*-
# 设置源文件编码格式为utf-8
示例:
# -*- coding: gbk -*-
print("你好!")
#这是一个在windows写的txt文档,如果在linux运行,需要加(# -*- coding: gbk -*-)
作用:
告诉解释执行器,此前文件的编码是什么?
练习:
1. 写程序实现复制文件的功能
要求:
1. 要考虑特大文件问题
2. 要关闭文件
3. 要能复制二进制文件
如:
- 请输入源文件路径名: /home/tarena/xxx.tar.gz
- 请输入目标文件路径名: ./a.tar.gz
显示:
文件已成功复制
try:
src = open(src_filename, 'rb') # 打开源文件用来读数据
try:
try:
dst = open(dst_filename, 'wb') # 打开目标文件用来写
try:
while True:
b = src.read(4096)
if not b: # 已经再也读不到数据了
break
dst.write(b)
print("复制成功")
finally:
dst.close()
except OSError:
print("打开写文件失败")
finally:
src.close()
except OSError:
print("复制失败")
2. 修改学生信息管理程序,要求加入两个功能:
9) 保存信息到文件(si.txt)
10) 从文件中读取数据(si.txt)
如果文章有错误,记得在评论区留言哦