目录
- 文件与操作流程
- 文本文件的操作
- 文本文件的写操作
- 文件迭代读取、标准输入输出
- flush方法
- 二进制文件操作
- 汉字编码
- python编码字符串
1. 文件与操作流程
文件 file :
文件是数据存储的单位
文件通常用来长期存储数据
文件中的数据是以'字节'为单位进行顺序存储的
文件的操作流程 :
1.打开文件
2.读写文件
3.关闭文件
任何操作系统,一个应用程序同时打开文件的数量有最大数限制
文件的打开函数 : open
open(file,mod = 'rt')
file : 打开文件的路径;字符串
mod :模式选择 r : read t :text
用于打开一个文件,返回此文件对应的文件流对象
如果打开失败,则会触发OSError错误
文件关闭方法 :
F.close() 关闭,释放系统资源
eg : #示意文件的打开和关闭,及错误处理
try:
f = open('c:\\Software\\python\\python 3.7\\NEWS.txt')
print('文件打开成功!')
f.close()
except OSError:
print('文件打开失败!')
mod = ‘’ 选择
字符 | 含义 |
---|---|
‘r’ | 以只读方式打开(默认) |
‘t’ | 文本文件模式打开(默认) |
‘w’ | 以只写方式打开,删除原有文件内容(如果文件不存在,则创建该文件并以只写方式打开) |
‘a’ | 以只写文件打开一个文件,如果有原文件则追加到文件末尾 |
‘x’ | 创建一个新文件,并以写模式打开这个文件,如果文件存在则会产生’FileExistsError’错误 |
‘b’ | 以二进制模式打开 |
‘+’ | 为更新内容打开一个磁盘文件(可读可写) |
注 :
- 1.缺省模式是’rt’
- 2.'w+b’可以实现二进制随机读写,当打开文件时,文件内容将被清零
- 3.'r+b’以二进制读和更新模式打开文件,打开文件时不会清空文件内容
- 4.'r+'以文本模式读和更新模式打开文件,打开文件时不会清空文件内容
2. 文本文件的操作
python文件读写的类型有两种 :
文本文件(text file)
二进制文件(binary file)
文本文件的操作 :
默认文件中储存的都为字符数据,以行为单位进行分隔
在python内部统一用'\n'作为换行进行分隔
对文本文件读写需要用字符串(str)进行数据读取和写入
各种操作系统的换行符 :
Linux换行符 : '\n'
Windows换行符 : '\r\n'
旧的Macintosh换行符 : '\r'
新的Mac Os 换行符 : '\n'
文本文件读操作
函数 | 说明 |
---|---|
file.close() | 关闭文件,关闭后文件不能再进行读写操作 |
file.read([size]) | 从文件读取指定的字节数,如果未给定或为负则读取所有 |
file.readline([size]) | 读取整行,返回字符串,包括 “\n” 字符 |
file.readlines([sizeint]) | 读取所有行并返回字符串列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力 |
file.flush | 把写入文件对象的缓存内容写入到磁盘 |
eg:#读入并打印 'c:\\Software\\python\\python 3.7\\info.txt'
def read_text_data(path):
try:
f = open(path)
print('文件打开成功!')
while True :
s = f.readline()
if s != '' :
if s[-1] == '\n':
print('>>>',s[:-1])
else :
print('>>>',s)
else :
break
f.close()
except OSError:
print('文件打开失败')
if __name__ == '__main__':
read_text_data('c:\\Software\\python\\python 3.7\\info.txt')
3. 文本文件的写操作
文本文件的写操作
open(file,mod = ‘rw’)
函数 | 说明 |
---|---|
file.write(str) | 将字符串写入文件,返回的是写入的字符长度。 |
file.writelines(sequence) | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符 |
#在当前目录建立hello.txt文件,并写入hello,
#'w'模式每次调用都会清空原内容
f = open('hello.txt','w')
s = f.write('hello')
f.close()
#'a'模式不会清空原内容,每次在文件末追加
f = open('hello.txt','a')
s = f.write('hello')
f.close()
#使用f.writelines 写入多行
f = open('hello.txt','w')
L = ['我是第一行\n','我是第二行\n','我是第三行']
s = f.writelines(L)
f.close()
#写一个程序 输入姓名电话,写入phonebook.txt文件中
#写一个读取'phonebook.txt'文件的程序,把保存的信息以表格形式打印出来
def input_tel():
'''将输入信息存储在一个列表中,每个人信息形成元组'''
L = []
while True :
name = input('请输入姓名 :')
if bool(name) == False:
break
tel = input('请输入电话 :')
L.append((name ,tel))
return L
def write_tel(lst,filename = 'phonebook.txt'):
'''将列表中的数据写入phonebook.txt中'''
try:
f = open(filename,'w')
for name,tel in lst :
f.write(name)
f.write(',')
f.write(tel)
f.write('\n')
f.close()
except OSError :
print('文件写入失败!')
def read_tel(filename = 'phonebook.txt'):
'''将phonebook.txt中数据读入,形成元组组成的列表'''
L = []
try:
f = open(filename)
while True :
s = f.readline() #以字符串格式按行读取
if bool(s) == False :
break
s = s.rstrip() #去掉右侧的换行符'\n'
name,tel = s.split(',') #拆成[name,tel]
L.append((name,tel))
f.close()
except OSError :
print('文件读入失败!')
return L
def print_tel(lst):
'''以表格形式打印结果'''
print('+------------+------+-------+')
print('| name | tel |')
print('+------------+------+-------+')
for temp in lst :
t = (temp[0].center(12),
temp[1].center(14))
line = "|%s|%s|" % t
print(line)
print('+------------+------+-------+')
if __name__ == '__main__':
L = input_tel()
write_tel(L)
L2 = read_tel(filename = 'phonebook.txt')
print_tel(L2)
4. 文件迭代读取、标准输入输出
文本文件的迭代读取 :
open()函数返回来的文件流对象是可迭代对象
eg:
f = open('abc.txt')
for line in f : #每次取出一行,相当于line=f.readline()
print(line) #按行读取 abx.txt 中每行
f.close()
标准输入输出文件
模块名 : sys
sys.stdin (默认为标准键盘输入设备)
ctrl + d 输入文件末尾标识符
sys.stdout (默认为屏幕终端)
sys.stderr (默认为屏幕终端)
标准文件不需要打开和关闭就可以使用
#sys.stdin 示例
import sys
s = sys.stdin.readline()
print(‘从键盘读取的第一行是 :’,s)
s = sys.stdin.read()
print('read读取到的信息是',s)
print('程序退出')
#sys.stdout 和 sys.stderr
import sys
sys.stdout.write('hello world\n')
sys.stderr.write('我的出现是个错误')
5. flush方法
file.flush : 把写入文件对象的缓存内容写入到磁盘
用法示例 :
import time
f = open('infos.txt','w')
f.write('helloooooo')
#f.flush() #强制清空缓冲区
time.sleep(15)
print('Zzz...')
print('程序唤起,继续执行')
f.close() #此时info.txt 写入 hello
6. 二进制文件操作
二进制文件操作方法
函数 | 说明 |
---|---|
F.tell() | 返回当前文件流的绝对位置(读写指针位置) |
F.seek(offset,whence=0) | 改变数据流的位置,返回新的绝对位置 |
F.readable() | 判断这个文件是否可读,可读返回True,否则返回False |
F.writeable() | 判断这个文件是否可写,可写返回True,否则返回False |
F.seekable() | 返回这个文件对象是否支持随机定位 |
F.truncate(pos=None) | 剪掉自pos位置之后的数据,返回新的文件长度(字节为单位) |
'b' 二进制(binary)文件操作 mod = 'rb'
对于二进制文件的读写通常需要用字节串(bytes)进行操作
eg:# 打开infos.txt文件,文件内容为 hello中文
#示意以二进制方式读取文件内容
#然后再将其转换为字符串
try :
f = open('infos.txt','rb') #以二进制模式打开
#在此处对f绑定的对象以bytes为单位进行读写
b = f.read(5) #读取五个字节
print(f.tell()) #>>>5 光标到第五个位置
print(b)
b += f.read(2)
print(b)
b += f.read()
print(b)
print('读取内容转为文字:',b.decode('utf-8'))
f.close()
except OSError :
print('打开文件失败')
#示意以二进制方式进行写操作
try :
f = open('infos.txt','wb')
f.write(b'\xe4\xb8\xad')
f.write(b'\r\n\x41\x42\x43') #window\r\n linux \n
f.close()
except OSError :
print('打开文件失败')
F.seek()方法
F.seek(偏移量,whence = 相对位置)
偏移量 : 大于0代表向文件末尾方向移动
小于0代表向文件头方向移动
相对位置 :
0 代表从文件头开始
1 代表从当前读写位置开始便宜
2 代表从文件尾开始偏移
eg:#文件中写入 :ABCDEabcde1234567890
#示例用F.seek方法来移动文件的读写指针位置
方法一
try :
f = open('infos.txt','rb')
print('当前读写位置是',f.tell()) #当前位置 0
#若想要读取abcde
f.seek(8,0) #相对于0向后偏移5个单位
print('当前读写位置是',f.tell()) #当前位置 5
b = f.read(5)
print(b)
f.close()
except OSError :
print('打开文件失败')
方法二
try :
f = open('infos.txt','rb')
print('当前读写位置是',f.tell()) #当前位置 0
#若想要读取abcde
f.seek(-15,2) #相对于2向前偏移15个单位
print('当前读写位置是',f.tell()) #当前位置 8
b = f.read(5)
print(b)
f.close()
except OSError :
print('打开文件失败')
7. 汉字编码
十个汉字占用多少字节?
Linux : 30 字节 UTF-8
Windows : 22 字节 GBK
汉字编码 :
1.国标系列 (windows常用) :
GB18030(二字节或四字节编码)
GBK(二字节编码)
GB2312(二字节编码)
2.国际标准(Linux / Mac OS X / IOS / Android常用):
Unicode(python内部编码) <----> UTF-8
8. python编码字符串
编码注释 :
在源文件的第一行或第二行写入如下内容为编码注释
# -*- coding:gbk -*-
#设置源文件编码为:gbk
# -*- coding:utf-8 -*-
#设置源文件编码为:utf-8
练习:
'''
写程序让用户输入一系列整数,当输入小于零的数时结束输入
1) 将输入的数字存于列表中
2) 将列表中的数字写入到文件numbers.txt中
3)将文件numbers.txt中的整数读入到内存中,
重新形成数字组成的列表.计算这些数的最大值,最小值,和他们的和
(提示: 需要将整数转为字符串或字节串才能存入文件中) '''
def input_num():
L = []
while True :
num = int(input('请输入一个整数 :'))
if num < 0:
break
else :
L.append(str(num))
return L
def write_num(L,filename = 'numbers.txt'):
try:
f = open(filename ,'w')
for i in L :
f.write(i)
f.write('\n')
f.close()
except OSError:
print('文件打开失败')
def read_num(filename='num.txt'):
L = []
try:
f = open(filename,'r')
try:
while True :
s = f.readline()
if s == '' :
break
i = int(s.rstrip())
L.append(i)
finally :
f.close()
except OSError :
print('文档打开失败')
eccept ValueError :
print('读取文件出错,数据可能有误')
return L
if __name__ == '__main__':
L = input_num()
write_num(L)
L2 = read_num()
print('最大值为',max(L2),'最小值为',min(L2),'和为%d ' ,sum(L2))