第二十八讲:文件:因为懂你,所以永恒
一、知识点:
0.file对象利用open函数来创建。
1.file文件的打开模式:f = open('文件地址',‘r/w/x/a等’)
- ‘r’:只读模式,以只读方式打开文件(默认模式,文件必须存在,不存在则抛出异常)
- ‘w’:只写模式,以写入的模式打开文件(不可读,不存在则创建,存在则清空内容)
- ‘x’:只写模式(不可读,不存在则创建,存在则报错)
- ‘a’:追加模式,以写入的模式打开文件(可读,不存在则创建,存在则在末尾追加写入,文件指针自动移到文件尾)
+表示可以同时读写某个文件
- ‘r+’:读写,可读可写
- ‘w+’:写读,可读可写,消除文件内容,然后以读写方式打开文件
- ‘x+’:写读,可读可写
- ‘a+’:写读,可读可写,以读写方式打开文件,并把文件指针自动移到文件尾)
b表示以字节的方式操作,以二进制模式打开文件,而不是文本模式打开
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码。
3、文件的对象方法:
序号 | 方法及描述 |
---|---|
1 | 关闭文件。关闭后文件不能再进行读写操作。 |
2 | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | 如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 | 返回文件下一行。 |
6 | 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | 读取整行,包括 "\n" 字符。 |
8 | 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
9 | 设置文件当前位置 |
10 | 返回文件当前位置。 |
11 | 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 |
12 | 将字符串写入文件,返回的是写入的字符长度。 |
13 | 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
--------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------
二、课后作业:
0.下边只有一种方式不能打开文件,请问是哪一种?为什么?
>>> f = open('E:/test.txt','w')#A
>>> f = open('E:\test.txt','w')#B
>>> f = open('E://test.txt','w')#C
>>> f = open('E:\\test.txt','w')#D
答:B。路径需要注意反斜杠。(以下为摘抄内容)Windows在路径名中既可以接受斜线(/)也可以接受反斜线(\),不过如果使用反斜线作为路径名的分隔符的话,要注意使用双行转义,否则Python会将反斜线进行转义,例如(\n)看成一个换行符,(\t)看作一个制表符等。
1.打开一个文件我们使用open()函数,通过设置文件的打开模式,决定打开的文件具有哪些性质,请问默认的打开模式是什么呢?
答:open()函数默认的打开模式是“rt”,即可读文本的模式打开。
2.请问>>> open(' E: \\Test.bin' , ' xb' ) 是以什么样的模式打开文件的?
答:以可写入的二进制模式打开文件Test.bin。
3.尽管Python有所谓的“垃圾回收机制”,但对于打开了的文件,在不需要用到的时候我们仍然使用f. close()将文件对象“关闭”,这是为什么呢?
答:Python拥有垃圾收集机制,会在文件对象的引用计数降至零的时候自动关闭文件,所以在Python编程里,如果忘记关闭文件并不会带来什么危险。但并不是说就可以不要关闭文件,如果你对文件进行了写入操作,那么你应该在完成写入之后进行关闭文件。因为Python可能会缓存你写入文件中的数据,如果这中间断电了神马的,那些缓存的数据根本就不会写入到文件中。所以,为了安全起见,要养成使用完文件后立刻关闭的优雅习惯。(答案摘抄)
4. 如何将一个文件对象(f)中的数据存放进列表中?
答:list(f)
5.如何迭代打印出文件对象(f)的每一行数据?
>>> for eachline in f:
print(eachline)
6.文件对象的内置方法f. read([size=-1])作用是读取文件对象内容,size参数是可选的,那如果设置了size=10,例如f. read(10),将返回什么?
答:将返回从文件指针开始的连续十个字符。
7.如何获得文件对象(f)当前文件指针的位置?
答:f.tell()
8.还是视频中的那个演示文件(record. txt),请问为何f. seek(45, 0)不会出错,但f. seek(46)就出错了呢?
>>> f.seek(46)
46
>>> f.readline()
Traceback (most recent call last):
Flie "<pyshell#18>", line 1, in <module>
f.readline()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xe3 in possition 4:illegal multibyte sequence
答:因为使用f. seek()定位的文件指针是按字节为单位进行计算的,演示文件(record. txt)是以GBK进行编码的,按照规则,一个汉字需要两个字节,f. seek(45)的位置位于字符“小”的开始位置,因此可以正常打印,而f. seek(46)的位置刚好位于字符“小”的中间位置,因此按照GBK的编码规则将无法将其解码!
--------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------
三、动动手:
0.试尝试将文件(OpenMe.mp3)打印到屏幕上。
f = open('D:\\OpenMe.mp3')
for i in f:
print(i,end='')
f.close()
1.编写代码,将上一题中的文件(OpenMe.mp3)保存为新文件(OpenMe.txt)
f = open('D:\\OpenMe.mp3')
f2 = open('D:\\OpenMe.txt','x')
f2.write(f.read())
f.close()
f2.close()
--------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------