[python全栈]02.python基础[part III](5)

目录

  1. 文件与操作流程
  2. 文本文件的操作
  3. 文本文件的写操作
  4. 文件迭代读取、标准输入输出
  5. flush方法
  6. 二进制文件操作
  7. 汉字编码
  8. 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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值