打开文件的三步:打开->操作->关闭
注意:
1.最大可以打开的文件的数量
2.打开后关闭的原因是因为这样不会浪费文字描述符
读取文本文件:
r r+ w w+ a a+
读取二进制文件:
rb rb+ wb wb+ ab ab+
r:(默认)
-只能读,不能写
-读取文件不存在,会报错
r+:
-可读写
-读取文件不存在,会报错
w:
-write only
-会清空文件之前的内容
-文件不存在,不会报错,会创建新的文件并写入
w+:
-rw
-会清空文件内容
-文件不存在,不报错,会创建新的文件
a:
-write only
-不会清空文件内容
-文件不存在,不会报错,会创建新的文件并写入
a+:
-rw
-文件不存在不报错
-不会清空文件内容
注意:
工作中一般不用’*+‘
实验:
1.打开关闭文件的实验如下:
-------->(1)题目要求:
举例说明如何打开并关闭文件,同时要求将文件中的内容输出
-------->代码如下:
<1>首先将/etc/passwd 备份到/tmp/passwd下(其目的仅仅为了证明文件的内容不会丢失或影响)
[root@foundation66 ~]# cp /etc/passwd /tmp/passwd
<2>在python的IDE中写入以下代码:
#打开文件
f=open('/tmp/passwd')
#读操作
content=f.read()
print(content)
#关闭
f.close()
-------->(2)题目要求:
尝试显示文件的是否可写或可读
-------->代码如下:
#打开文件
f=open('/tmp/passwd')
print(f.writable())
print(f.readable())
#关闭
f.close()
-------->测试结果:
结果说明,此文件不可写,但可以读
2.关于r的实验:
-------->(1)题目要求:
r:如果文件存在时,可以进行读操作
-------->代码如下:
#打开文件
f=open('/tmp/passwd','r')
#读操作
content=f.read()
print(content)
print(f.writable())
print(f.readable())
#关闭
f.close()
-------->(2)题目要求:
r:如果文件不存在时,会出现报错
-------->代码如下:
#打开文件
f=open('/tmp/passwdd','r')
#读操作
content=f.read()
print(content)
print(f.writable())
print(f.readable())
#关闭
f.close()
-------->(3)题目要求:
r+:如果文件存在时,可以对文件进行读写操作
-------->代码如下:
<1>更改/tmp/passwd的文件权限为777
[root@foundation66 ~]# chmod 777 /tmp/passwd
[root@foundation66 ~]# ll /tmp/passwd
<2>在python中写入的代码如下:
#打开文件
f=open('/tmp/passwd','r+')
#读操作
content=f.read()
print(content)
#写操作
f.write('hello')
print(f.writable())
print(f.readable())
#关闭
f.close()
注意:
此处的写操作无法读出文件的内容是因为指针移动了,如果想要直接读取文件的内容,需要将指针重新移到0,在命令行式shell中可以查看到更改的信息:
-------->测试结果:
注意:
在python还在运行的时候,开启shell界面拉伸界面框时,写入的内容可能会消失(使用cat命令)
(此题与上题的差距是此题是从先开始就写入内容,而上题是当文件读完后写入内容)
-------->(4)题目要求:
查看指针指向的位置分析为什么没有读取到写入的内容
-------->代码如下:
f = open('/tmp/passwd','r+')
#查看当前指针所在的位置
print(f.tell())
f.write('python')
print(f.tell())
content = f.read()
print(content)
f.close()
注意:
此处的写操作无法读出文件的内容是因为指针移动了,如果想要直接读取文件的内容,需要将指针重新移到0,在命令行式shell中可以查看到更改的信息:
-------->测试结果:
3.关于w的实验:
w:只能写不能读
-------->(1)题目要求:
举例说明使用w会清空文件之前的内容
-------->代码如下:
<1>在python中写入如下代码:
f=open('/tmp/passwd','w')
f.write('hello')
print(f.writable())
print(f.readable())
f.close()
<2>在命令行中查看是否清空文件中的内容并新写入内容
[root@foundation66 tmp]# ls
[root@foundation66 tmp]# cat passwd
-------->测试结果:
-------->(2)题目要求:
举例说明当文件不存在时,使用w+不会报错,并会创建新的文件并写入
-------->代码如下:
<1>在python中写入如下代码:
f=open('/tmp/passwdd','w')
f.write('hello haha')
print(f.writable())
print(f.readable())
f.close()
<2>在命令行中查看是否新添加了文件
[root@foundation66 tmp]# ls
[root@foundation66 tmp]# cat passwdd
w+:可以写可以读
-------->(3)题目要求:
会清空文件之前的内容
-------->代码如下:
<1>在python中写入如下代码:
f=open('/tmp/passwd','w+')
#读操作
content=f.read()
print(content)
#写操作
f.write('hello')
#判断其读写是否可行
print(f.writable())
print(f.readable())
f.close()
<2>在命令行中查看文件是否被清空
[root@foundation66 tmp]# cat passwd
-------->(4)题目要求:
举例说明使用w+时,若文件不存在,不会报错,会创建新的文件并写入
-------->代码如下:
<1>在python中写入如下代码:
f=open('/tmp/passwddd','w+')
content=f.read()
print(content)
f.write('hello')
print(f.writable())
print(f.readable())
f.close()
<2>在命令行中查看是否新添加了文件并写入内容
[root@foundation66 tmp]# ls
[root@foundation66 tmp]# ls
-------->测试结果:
4.关于a的实验
a:只可以写
-------->(1)题目要求:
举例说明使用a时不会清空文件内容
-------->代码如下:
<1>在python中写入如下代码:
f=open('/tmp/passwd','a')
f.write('heihei')
print(f.writable())
print(f.readable())
f.close()
<2>在命令行中查看文件是否被清空,发现没有清空,写入的内容自动追加到文件末尾
#执行python代码前的查看
[root@foundation66 tmp]# cat passwd
#执行python代码后的查看
[root@foundation66 tmp]# cat passwd
-------->(2)题目要求:
举例说明当使用a时,如果文件不存在,不会报错,会创建新的文件并写入
-------->代码如下:
<1>在python中写入如下代码:
f=open('/tmp/passwdddddd','a')
f.write('heihei')
print(f.writable())
print(f.readable())
f.close()
<2>在命令行中查看是否新添加了文件并写入内容
[root@foundation66 tmp]# ls
[root@foundation66 tmp]# cat passwdddddd
-------->(3)题目要求:
-------->代码如下:
<1>在python中写入如下代码:
f=open('/tmp/passwd','a+')
f.write('lala')
print(f.writable())
print(f.readable())
f.close()
<2>在命令行中查看文件是否被清空,发现没有清空,写入的内容自动追加到文件末尾
#执行python代码前的查看
[root@foundation66 tmp]# cat passwd
#执行python代码后的查看
[root@foundation66 tmp]# cat passwd
-------->(4)题目要求:
-------->代码如下:
<1>在python中写入如下代码:
f=open('/tmp/passw','a+')
f.write('heihei')
print(f.writable())
print(f.readable())
f.close()
<2>在命令行中查看是否新添加了文件并写入内容
#执行python代码前的查看
[root@foundation66 tmp]# ls
#执行python代码后的查看
[root@foundation66 tmp]# ls
[root@foundation66 tmp]# cat passw
-------->测试结果:
注意:
红帽6管理的服务都用的是脚本,红帽7用的是systemctl
<1>文件的读取操作
-------->(1)题目要求:
读取/tmp/file文件,并以二进制形式输出(写在一起)
-------->代码如下:
<1>首先建立一个文件并写入内容
[kiosk@foundation66 tmp]$ vim file
[kiosk@foundation66 tmp]$ cat file
<2>在python中写入代码:
f = open('/tmp/file','rb+')
print(f.read())
f.close()
-------->(2)题目要求:
读取文件内容,返回文件中第一行的内容,并以二进制形式输出(显示第一行)
-------->代码如下:
f = open('/tmp/file','rb+')
print(f.readline())
f.close()
-------->(3)题目要求:
读取文件内容,将文件中的内容返回成一个列表输出(将每一行都返回成列表中的一个元素并输出)
-------->代码如下:
f = open('/tmp/file','rb+')
print(f.readlines())
f.close()
-------->测试结果:
注意:
readlines表示读取文件内容,返回一个列表,列表的元素分别为文件行内容
-------->(4)题目要求:
举例说明读取二进制文件时的一些特殊情况(例如只输出前几个字符或者除了这些以外的字符)
-------->代码如下:
f = open('/tmp/file','rb+')
#head -c 4 /etc/file
#输出第一行中的前三个字符
print(f.read(3))
#输出第一行中除了前三个字符以外所有的字符
print(f.readline(),end='')
print('\n')
#输出除了第一行字符以外的所有字符,并以列表形式展现
print(f.readlines(),end='')
f.close()
注意:
默认情况下读取文件的所有内容,小文件可以直接用read读取,如果是大文件(文件大小>内存大小),不能通过read一次性读取所有内容
-------->(5)题目要求:
默认情况下读取文件的所有内容,小文件可以直接用read读取,如果是大文件(文件大小>内存大小),不能通过read一次性读取所有内容,必须借助于for循环依次读取
-------->代码如下:
f = open('/tmp/file','rb+')
print([line.strip() for line in f.readlines()])
f.close()
注意:
strip表示该取出广义的空格,\n,\t都输出广义的
<2>文件指针的移动
seek方法,移动指针
seek的第一个参数是偏移量:>0,表示向右移动,<0表示向左移动
seek的第二个参数是:
0:移动指针到文件开头
1:不移动指针
2:移动指针到末尾
(-1,2)移动到文件最后
(0,0)移动到文件最前
-------->(6)题目要求:
移动文件指针
-------->代码如下:
f = open('/tmp/passwd','rb')
print(f.tell())
print(f.read(3)) #读取3个字母
print(f.tell())
f.seek(-1,2) #将指针移动到最后一个元素中
print(f.tell())
f.seek(0,0) #将元素移动到文件开头
print(f.tell())
f.close()
-------->测试结果:
注意:
1.通过查看文件/tmp/passwd中的字符数,可以直到指针此时的位置是最后一个元素2.也可以将内容写入后再进行指针的移动,代码如下
f.write(‘hello’) #将‘hello’写入
f.writelines([‘a’,‘b’]) #将列表里的每个元素写入文件
readlines():读取文件内容,返回一个列表,列表的元素分别为文件行内容
strip去的是广义的空格,\t,\n
-------->(1)题目要求:
读取"hello.png"的二进制文件,如果没有出现报错说明读取成功(hello.png已经提前导入到文件中)
-------->代码如下:
f1=open('hello.png',mode='rb')
content=f1.read()
f1.close()
-------->(2)题目要求:
将"hello.png"中的二进制文件写入到"111.png"中
-------->代码如下:
f1=open('hello.png',mode='rb')
content=f1.read()
f1.close()
f2=open('111.jpg',mode='wb')
f2.write(content)
f2.close()
-------->测试结果:
结论分析:
当执行完python代码后,会自动生成一个名为111.png的二进制文件,其内容与hello.png中的内容一致,说明非纯文本文件读取成功
使用上下文管理器便可以不用写open和close
-------->(1)题目要求:
举例说明上下文管理器的使用:
-------->代码如下:
f=open('/tmp/passwd')
with open('/tmp/passwd') as f:
print(f.read())
-------->(2)题目要求:
举例说明如何将/etc/passwd中的内容移动至新的文件中
-------->代码如下:
#同时打开两个文件
with open('/tmp/passwd') as f1,\
open('/tmp/passwd1','w+') as f2:
#将第一个文件的内容写到第二个文件中
f2.write(f1.read())
#移动指针到文件最开始
f2.seek(0)
#读取文件内容
print(f2.read())
-------->测试结果:此时使用shell命令行中也可以查询到文件中的内容
-------->(3)题目要求:
练习:创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数
-------->代码如下:
import random
f=open('data.txt','w+')
for i in range(100000):
f.write(str(random.randint(1,100)) + '\n')
f.seek(0)
print(f.read())
f.close()