使用open()函数打开文件l

文件打开模式:

r 以只读方式打开文件(默认)

w 以写入的方式打开文件,会覆盖已存在的文件

x 如果文件已经存在,使用此模式打开将引发异常

a 以写入模式打开,如果文件存在,则在末尾追加写入

b 以二进制模式打开文件

t 以文本模式打开(默认)

+ 可读写模式(可添加到其他模式中使用)

U 通用换行符支持


文件对象方法:

f.close() 关闭文件

f.read(size=-1) 从文件中读取size个字符,当为给定size或给定值为负值的时候,读取剩余的所有字符,然后作为字符串返回

f.readline() 以写入模式打开,如果文件存在,则在末尾追加写入

f.write(str) 将字符串str写入文件

f.writelines(seq) 向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象

f.seek(offse,from) 在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节

f.tell() 返回当前在文件中的位置


打开一个文件将其保存到变量中

file = open('C:/record.txt') #打开C盘下的record.txt文件,并将对象赋值给file


file.read()     # 读取全部的文件内容

file.read(5) # 读取从指针开始的5个字符

file.tell() # 可以打印指针的位置

此时,指针已经指向文件末尾,如果再执行file.read(),则会打印一个空字符

如果要再次读取文件内容需要使用seek()方法,把指针指向文件内

file.seek(0,0)   # 把指针指向文件起始位置,偏移量为0

file.seek(45,0) # 指针指向从起始位置0开始的第45个字节 

file.readline() # 打印一行


list(file) #使用list()函数把file转成列表


使用for循环,直接分行打印文件内容

for each_line in file:

print(each_line)


file.close() # 当文件使用完毕,一定要关闭文件


file = open('D:/test.txt','w') # 以写入的方式打开D盘下的test.txt文件,如果此文件不存在将创建之

file.write('I love Python.) # 写入一行字,此时字符还没被写入到文件中,只是存放在缓存中

file.close() # 关闭文件,上面写入的内容将从缓存中写到文件里面


>>> file = open('D:/test.txt','w')

>>> file.write('I love python.')

14

>>> file.close()

>>> file = open('D:/test.txt')

>>> file.read()

'I love python.'


---------------------------分隔符,哈哈哈---------------------------------

课后作业:


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' ) 是以什么样的模式打开文件的?

以可写入的二进制模式打开文件


3.尽管Python有所谓的“垃圾回收机制”,但对于打开了的文件,在不需要用到的时候我们仍然使用f. close()将文件对象“关闭”,这是为什么呢?

(抄的)Python拥有垃圾收集机制,会在文件对象的引用计数降至零的时候自动关闭文件,所以在Python编程里,如果忘记关闭文件并不会带来什么危险。但并不是说就可以不要关闭文件,如果你对文件进行了写入操作,那么你应该在完成写入之后进行关闭文件。因为Python可能会缓存你写入文件中的数据,如果这中间断电了神马的,那些缓存的数据根本就不会写入到文件中。所以,为了安全起见,要养成使用完文件后立刻关闭的优雅习惯。


4. 如何将一个文件对象(f)中的数据存放进列表中?

list(f)


5.如何迭代打印出文件对象(f)的每一行数据?

>>> for each_line in f:

print(each_line)


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 each_line in f:

print(each_line)


1.编写代码,将上一题中的文件(OpenMe.mp3)保存为新文件(OpenMe.txt)

>>> f1 = open('D:/OpenMe.mp3')

>>> f2 = open('D:/OpenMe.txt','x')

>>> f2.write(f1.read())

675

>>> f1.close()

>>> f2.close()