python file文件操作--内置对象open
说明: 1. 函数功能打开一个文件,返回一个文件读写对象,然后可以对文件进行相应读写操作。 2. file参数表示的需要打开文件的相对路径(当前工作目录)或者一个绝对路径,当传入路径不存在此文件会报错。或者传入文件的句柄。 >>> a = open('test.txt') # 相对路径 >>> a <_io.TextIOWrapper name='test.txt' mode='r' encoding='cp936'> >>> a.close() >>> a = open(r'D:PythonPython35-32test.txt') # 绝对路径 >>> a <_io.TextIOWrapper name='D:PythonPython35-32test.txt' mode='r' encoding='cp936'> 3. mode参数表示打开文件的模式,常见的打开模式有如下几种,实际调用的时候可以根据情况进行组合。
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。 打开文件的模式有:
"+" 表示可以同时读写某个文件
?"b"表示以字节的方式操作
?注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型 ?t为文本读写,b为二进制读写 ?# t为文本读写,b为二进制读写 >>> a = open('test.txt','rt') >>> a.read() 'some text' >>> a = open('test.txt','rb') >>> a.read() b'some text' # r为只读,不能写入;w为只写,不能读取 >>> a = open('test.txt','rt') >>> a.write('more text') Traceback (most recent call last): File "<pyshell#67>",line 1,in <module> a.write('more text') io.UnsupportedOperation: write >>> a = open('test.txt','wt') >>> a.read() Traceback (most recent call last): File "<pyshell#69>",in <module> a.read() io.UnsupportedOperation: not readable #其它不一一举例了? 4.?buffering表示文件在读取操作时使用的缓冲策略。 0: ? ?代表buffer关闭(只适用于二进制模式) 5.?encoding参数表示读写文件时所使用的的文件编码格式。 假设现在test.txt文件以utf-8编码存储了一下文本: ? ? ? >>> a = open('test.txt','rt') # 未正确指定编码,有可能报错 >>> a.read() Traceback (most recent call last): File "<pyshell#87>",in <module> a.read() UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 8: illegal multibyte sequence >>> a = open('test.txt','rt',encoding = 'utf-8') >>> a.read() '我是第1行文本,我将被显示在屏幕n我是第2行文本,我将被显示在屏幕n我是第3行文本,我将被显示在屏幕' >>> 6.?errors参数表示读写文件时碰到错误的报错级别。 常见的报错基本有:
>>> a = open('test.txt',encoding = 'utf-8') >>> a.read() '我是第1行文本,我将被显示在屏幕n我是第2行文本,我将被显示在屏幕n我是第3行文本,我将被显示在屏幕' >>> a = open('test.txt','rt') >>> a.read() Traceback (most recent call last): File "<pyshell#91>",in <module> a.read() UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 8: illegal multibyte sequence >>> a = open('test.txt',errors = 'ignore' ) >>> a.read() >>> a = open('test.txt',errors = 'replace' ) >>> a.read() 7.?newline表示用于区分换行符(只对文本模式有效,可以取的值有None,'n','r','','rn') >>> a = open('test.txt',encoding = 'utf-8',newline = 'r') >>> a.readline() '我是第1行文本,我将被显示在屏幕r' >>> a = open('test.txt',newline = 'n') >>> a.readline() '我是第1行文本,我将被显示在屏幕rn' 8.?closefd表示传入的file参数类型(缺省为True),传入文件路径时一定为True,传入文件句柄则为False。 >>> a = open('test.txt',newline = 'n',closefd = False) Traceback (most recent call last): File "<pyshell#115>",in <module> a = open('test.txt',closefd = False) ValueError: Cannot use closefd=False with file name >>> a = open('test.txt',closefd = True) ? ? 笔记总结: a)?以二进制方式读写文件? python3 提供了一种机制,以字节(二进制)的方式打开 1 #二进制方式写入文件 2 f = open("d:/data.txt","wb") 3 str = "卧室丽1" 4 #需要将字符串转换为二进制以后才能添加 5 f.write(bytes(str,encoding="utf-8")) 6 f.close() 7 8 9 #二进制方式读取文件 10 "rb") 11 str = f.read() 12 13 print(str) ?输出结果: ? 卧室丽1
b'xe5x8dxa7xe5xaexa4xe7xbdx97xe6x99x93xe4xb8xbd1'
b) r+,w+,x+,a+ 四种模式都是可读可写,那么他们的区别是什么? 想了解区别,首先知道file的四个方法: 1. read(): 读数据,?2.write(): 写数据,? 3.tell(): 获取当前指针的位置,? 4.seek(): 重置指针的位置.
r+ ?读写文件
1 print("-------- r+: 从头读取,写入后指针指向最后 -------------") #r+: 读的时候从开始向后读数据, 写的时候是在末尾追加,指针指向末尾 4 f = open(d:/data.txt",r+utf-8tell 获取指针位置,位置是0 print(f.tell()) 7 指定读取3个字符,一个汉字三个字节 8 str = f.read(3 9 此时指针已经在第9个字节的位置了 (str) 再次读取6个字符,那么指针应该指向9+18=27的位置了 13 str = f.read(614 指针指向第27个字符 15 16 17 18 此时,在写,写完之后看看指针在哪里? 19 f.write(SSSBBB20 指针指向最后了 21 22 由此可见,读的时候可以调整指针,但是写的时候指针都是调整到最后去写. 23 24 f.close() 执行结果: 1 -------- r+: 从头读取,写入后指针指向最后 ------------- 2 0 3 9 4 美丽丽 5 20 6 卧室丽1 7 8 26 注意: 如果在文件打开后就写入,则会写在开始,并覆盖指定字符数. 因为以r+方式打开,指针指向文件最开始. ?注意分析一下代码: ======= 测试r+模式write数据指针的位置变化 ===== 2 先清空再写入数据 data.txt 5 content = 你是谁,我也不知道,啊啊啊啊啊" 文件内容: ,content) 8 str = f.write(content) 10 --------------12 13 14 以r+的方式open数据,open后指针在文件的最开始,这个时候write数据,1)"> 会从最开始插入数据,并替换原来的字节数 17 f = open(文件打开后,指针位置: aaaaaa写入aaaaaa后,1)">21 22 str = f.read(323 读取三个字符后,1)">24 读取三个字符内容: 25 在中间的位置write数据,则追加到最后. 26 f.write(bbbb27 再次写入bbbb内容后,1)">28 f.close() ? 执行结果: 1 ======= 测试r+模式write数据指针的位置变化 ===== 文件内容: 你是谁,啊啊啊啊啊 3 -------------- 5 写入aaaaaa后,指针位置: 6 6 读取三个字符后,指针位置: 13 7 读取三个字符内容: 谁,我 8 再次写入bbbb内容后,指针位置: 65 ? w+ ?读写文件
========== #w+ ===========w+ : 先清空,在写读. 先写,后读. 写后指针指向末尾 6 f = open(w+ 7 data = f.read() 8 data:"+data) 9 f.write(美丽丽 写完之后直接读,读不到内容,因为写完以后指针已经知道最后了 11 data =after write:13 使用seek重新让指针指向0 f.seek(0) 15 data =(data) 17 f.close() 执行结果: 1 ========== w+ =========== data: 3 after write: 4 美丽丽
x+ 与 w+ 的区别:
#x+: x+和w+一样,只是额外的存在一个功能,那就是文件存在则报错.
? ? a+ ?读写文件
? -------------a+: 打开文件,执行指向最后,调整指针位置读取--------------a+: 可以读可以写 f = open(a+当前指针指向位置,使用a+的方式,打开的同时指针已经在最后的位置 读取三个字节,读取内容为空,因为指针指向最后 str = f.read(1读取3个字符后指针的位置 (f.tell()) 重新将指针指向开始 读取指针的位置 读取一个字符 str= f.read(1 一个字符后,指针的位置 (str) f.close() ? ? ?文件操作常用方法 ? 1. close 关闭文件. ? with自动关闭打开的file.无需手动调用close()方法 2 with open(r) as f: 3 str = f.readline() 4 5 with 还可以同时打开两个文件. 可以用于文件拷贝. 例如:将文件1的内容拷贝到文件2 7 with open(") as f1,open(data1.txtw) as f2: 8 读取文件1的每一行数据,写入到文件2 9 for line in f1: 10 f2.write(line) ? 2.?flush 将文件从缓冲区刷新到硬盘 write到file的内部,在进程没有结束之前,都是保存在内存中,通过flush方法可以将文件刷到硬盘上
1 f = open(2 f.write(再次添加内容2 手动调用flush方法,将write的内容刷入硬盘 f.flush() 5 str = input(请输入:6 在执行到input时,进程没有结束,文件write的内容保存在内存中,并没有保存在硬盘上. 8 放开 f.flush(),手动刷新内存中的文件到硬盘上 ? ? 将文件输入到硬盘有三种方法
===== flush 刷新文件内部缓冲区 =======1. 手动调用close()方法 5 f.write(新添加的内容 执行f.close()后,会自动调用flush将write的内容写进硬盘. 9 2. 进程结束,自动刷新内存中内容到硬盘 12 f = open(13 f.write(再次添加内容1 进程结束,也会自动将write的内容刷如硬盘 15 16 3. 手动调用flush()方法,手动刷新内存中内容到硬盘 19 f = open(20 f.write(f.flush() 23 str = input(") ? truncate: 截断数据,仅保留指定之前数据
? truncate: 截断数据,仅保留指定之前数据 2 f = open(f.seek(5) 一个参数,指定保留字符个数 5 f.truncate(20 f.flush() 10 f.close() 运行前文件内容: ? ? 运行后文件内容:
? (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |