#20200930 文件的读取和写入
# 1、文件的打开方式(主要针对文本文档)
#2、文件内容读取
#3、文件内容写入
#4、文件扩展用法
# 打开文件用open()函数
# file_object = open(file_name,access_mode='r')
#以上函数格式中各个命名代表的意思分别是:
# file_name 文件路径:相对路径和绝对路径。
#access_mode:
# 读(定义时等于号指定的值,是缺省参数r)
# 写
# 读+写
# 文件路径的写法:有三种 2、3中更常用
# filename='G:/prthTest1,txt'
# filename='G:\prthTest1,txt' #加两个\是为了取消转义
# filename=r'G:prthTest1,txt' #r 取消转义 --只在python中用
# file_object---简写fo
# filename='J:\practice.txt'
# fo = open(filename)#加入参数encoding='utf-8'表示读的编码是中文
# # print(type(fo)) #打印对象类型,是个文件对象<class '_io.TextIOWrapper'>
# print(fo) #打印这个文件对象得到结果如下,有几个参数
##<_io.TextIOWrapper name='J:\practice.txt' mode='r' encoding='cp936'>
##打印结果意思:这是一个文件对象,路径是J盘下的那个名字,模式是只读,编码是cp936,
##那如果想读中文编码怎么办呢? 在fo = open(filename)中加入参数encoding='utf-8'
#文件的相对路径
#如果是进程文件,不是全路径,如:
# open('file1.txt) # open('./file1.txt')
# open('fold1/file1.txt')
# open('../file1.txt')
#../../表示的是上级目录的上级目录,以此类推
#相对于当前目录来寻找该文件,称之为相对路径
##文件内容读取
# fo.read()函数 该函数返回的是str
#文件模式--r
# 只是为了读取文件而打开文件。文件指针在文件的开头。这也是缺省的文件打开方式,即
#open('file') = open('file','r')
# 注意文件指针的移动,最后的关闭操作
#read()函数如果有具体读的长度,就读具体个数,写作: str1=foo.read(3)
# filname ='J:\practice.txt' #记住要先给路径赋变量名
# foo=open(filname,encoding='utf-8') #然后给open(路径变量名)这个函数赋予变量名
# str1=foo.read(2) #str=函数变量名.read(3)
# print(str1) #print(foo.rede(2)) 也是可以的 #打印结果:12(文件代码是123123123)
# print(foo.read(2)) #打印结果是:31,为什么呢?
#读了两个之后再读,是继续往后面读,因为光标的位置在第一次读之后移到了第三位前面
#同理,第三次读全部的话,就是读23123
#read()函数如果没有具体读的长度,就读全部,写作: str1=foo.read()
# filname ='J:\practice.txt' #记住要先给路径赋变量名
# foo=open(filname,encoding='utf-8') #然后给open(路径变量名)这个函数赋予变量名
# str1=foo.read() #str=函数变量名.read()
# print(str1) #打印结果:文件全部内容
# 读了之后文件关闭
# fo.close() #注意fo是文件对象,及open()函数赋予的变量名
# 如果文件被关闭了再去读,也是会报错的 如下:
# filname ='J:\practice.txt' #记住要先给路径赋变量名
# foo=open(filname,encoding='utf-8')
# #print(foo.read()) #读取的全部内容
# foo.close()
# print(foo.read()) #关闭了文件之后再去读取文件
# #报错了ValueError: I/O operation on closed file.
#---文件指针
# 文件指针的概念:即读取文件时,光标标记的那个就是指针,光标标记着文件读取的位置
# 指针就是接下来的读写操作开始的位置
# 如何获取到文件指针的位置呢 tell()函数 eg:
# filname ='J:\practice.txt' #记住要先给路径赋变量名
# foo=open(filname,encoding='utf-8') #然后给open(路径变量名)这个函数赋予变量名
# print(foo.tell())
# print(foo.read(3)) #print(foo.rede(2)) 也是可以的 #打印结果:12(文件代码是123123123)
# print(foo.tell()) #打印的光标位置是3,由此可见tell()函数获取到的光标位置是这一位的后面
# print(foo.read(2))
#--在代码中怎么移动光标达到读取文件指定内容呢?
# 文件指针的移动 seek()函数 使用方法:
# fo.seek(1,0) #seek()有两个参数:(移动到的位置,模式)
# 0模式意思是永远从文件指针开始的地方计算,即从0开始
# 0模式对应的是读'r'模式
# fo.seek(x)扩展用法:(开发用的比较多,测试做了解)
# 1模式是当前模式
# 2模式是尾部模式 用法举例子:
# filname ='J:\practice.txt' #记住要先给路径赋变量名
# foo=open(filname,encoding='utf-8') #然后给open(路径变量名)这个函数赋予变量名
# print(foo.tell())
# print(foo.read(2))
# print(foo.tell()) #这里的打印结果是2,表示指针移到了第二位后面
# print(foo.seek(5,0)) #打印结果5,说明光标移到了第五位后面
# print(foo.seek(5,1))
# 报错can't do nonzero cur-relative seeks,说明seek的1模式不支持read模式,怎么办呢?
# 以二进制方式去打开文件,seek的1模式和2模式都只支持二进制的.如下:
# finame='J:\practice.txt'
# foo=open(finame,'rb') #在open中添加参数'rb',表示已二进制方式打开文件
# print(foo.seek(1,1)) #打印结果是2,表示指针在第二位的前面
# print(foo.read(3)) #读的结果是b'231',b表示是以二进制读的,引号里面是读到的内容
# #print(foo.seek(1,1)) #打印的是5,代表指针已经移到了第五位的前面
# print(foo.seek(-1,1)) #打印结果是3,代表光标移到了第三位(因为读的时候读到的内容是1231,此时光标是在第四位)
# #第96行注销了再读-1,-1代表指针往前面移一位
# 将94-98都注销试试模式2:
# print(foo.seek(0,2)) #移动到了文件的末尾 打印得9
# print(foo.seek(-2,2)) #移动到了文件倒数第二个字符 打印得7,代表光标在第七位的后面
# print(foo.read()) # 打印结果是b'23'
# print(foo.seek(0)) #移动到头 打印得0
# print(foo.read()) #b'123123123'
# print(foo.seek(2,1)) #移动到当前指针往后两个字符,打印得11,因为之前读了文件全部内容,指针在第九位后面
#--读一行怎么读? readline()函数
# finame='J:\practice.txt'
# foo=open(finame)
#print(foo.readline()) #打印得:b'123123123'
#--读多行怎么读? readlines()函数
#print(foo.readlines()) #打印得:['22322
', '323321']
#读取多行返回的是list列表
# 注:Windows--文件里面的换行是
两个长度
#字符串和Linux里面的换行符都是
,一个长度
#--怎么去掉换行符呢?用splitlines()函数
# print(foo.read().splitlines()) #打印得['123123123', '22322', '323321'],也是列表
#2.文件的写的操作,如果文件不存在会新建,文件若存在会清空所有的内容
# 使用场景:输出本次使用的详细信息
# finame='J:\practice.txt'
# foo=open(finame,'w') #文件已经被清空了
# #写操作: 注意写入的是字符串
# foo.write('asdfghj') #本质不是写在磁盘,而是写在缓存,要关闭或者刷新文件(保存)才能写入
# foo.close() #关闭了,现在文件已经被写入了.功能同:foo.flush()
#--追加a写法:即不清空文件而追加内容。用法如后图:
# a:
# 只是为了在文件末尾追加内容而打开文件
# 如果文件存在,指针是在文件的末尾的
# 如果文件不存在,则创建一个新文件
# finame='J:\practice.txt'
# #foo=open(finame)
# #print(foo.read()) #先读一下文件内容:asdfghj
# # 注销掉131-133行之后用a模式打开文件.
# foo=open(finame,'a')
# foo.write('这是追加的内容')
# foo.flush()
# --如果想换行写追加的内容怎么办?a模式下怎么换行呢?
# 在追加的内容前面加上
# foo.write('
这是追加的内容')
# foo.flush()
# 文件的扩展用法,再学三种模式,r+.w+.a+
# r+模式:为了读取并且写文件而打开文件,如果文件不存在会报错,文件的指针在文件的开头
# w+模式:为了读取并且写文件而打开文件,如果文件不存在,会建立一个新的文件,如果文件已经
# 存在,会清空文件内容,文件指针在文件的开头
# fil='d:\ordinary.txt'
# foa=open(fil,'w+',encoding='utf-8')
# foa.write('新建了这个文件并写入了这段话')
# a+模式:为了读取并且写入文件而打开文件,如果文件不存在,会建立一个新的文件,文件指针在
# 文件的末尾,很多OS上写操作永远在文件结尾进行,不管是否用例seek
# --如果需要同时打开多个文件怎么办?
# --一次打开多个文件的优势:可以省略一个close()的操作
# with open(文件路径) as 文件对象,open(文件路径) as 文件对象2
#在缩进里面写文件操作的代码 eg:
# fil='d:\ordinary.txt'和finame='J:\practice.txt' 现有这两个文件
#
# with open('d:\ordinary.txt','a',encoding='utf-8') as foo,open('J:\practice.txt','a',encoding='utf-8') as oa:
# foo.write('批量打开的第一个文件')
# oa.write('追加加载的批量打开的文件')
# oa.flush()