1、文件操作的步骤
1 打开文件
open() 方法用于打开一个文件,并返回文件对象,使用变量接收该文件对象。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。文件名称指定将要进行操作的具体文件,模式指定可以对该打开的文件对象进行的操作(读,写)
2 对文件对象进行操作
3 关闭文件对象
close() 方法用于关闭一个打开的文件对象,在文件对象关闭之后,不能再对其进行任何读写操作。
2、对文件对象进行操作
read()方法 :
read()方法从一个打开的文件中读取一个字符串,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾
write()方法
write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字,write()方法不会在字符串的结尾添加换行符(’\n’), 在这里,被传递的参数是要写入到已打开文件的内容
对文件能进行的具体操作,由打开文件对象的时候使用的mode参数决定。
1、 f = open(’/public/toto’,mode=‘r’) :r(默认参数):
- 只能读,不能写
- 读取文件不存在 会报错
2 、f = open(’/public/toto’,mode=‘w’) :w(写):
- write only(只能进行写操作)
- 文件不存在的时候,会自动创建新的文件
- 文件存在的时候,会清空文件内容并写入新的内容
3 、f = open(’/public/toto’,mode=‘a’) :a(追加):
- write only(只能进行写操作)
- 写:不会清空文件的内容,会在文件末尾追加
- 写:文件不存在,不会报错,会创建新的文件并写入内容
4 、f = open(’/public/toto’,mode=‘r+’) :r+
- -r/w(读/写权限)
- -文件不存在,报错
- -默认情况下,从文件指针所在位置开始写入
5 、f = open(’/public/toto’,mode=‘w+’) :w+
- -r/w(读/写权限)
- -文件不存在,不报错,会自动创建新的文件
- -会清空文件内容
6 、 f = open(’/public/toto’,mode=‘a+’) :a+
- -r/w(读/写权限)
- -文件不存在,不报错,会自动创建新的文件
- -不会清空文件,在末尾追加
文本文件与二进制文件(视频,音频,图片)
对纯文本文件进行操作时候,mode参数:t表示文本文件
r r+ w w+ a a+ == rt rt+ wt wt+ at at+
对二进制文件进行操作时候,mode参数:b表示文本文件
rb rb+ wb wb+ ab ab+
将打开文件对象时候使用的mode参数换成针对二进制文件的参数,操作方法和步骤与上述一致
注意
-
使用参数
w/w+/wb/wb+
打开文件对象的时候,默认一定会写入内容到打开的文件中,对文件中的元内容进行覆盖,如果使用这些参数打开文件对象,但是并没有写入任何东西在文件中,那么文件内容将会被清空。 -
对文件进行读取,从文件的什么位置开始进行操作,由指针当前所在的位置决定,指针在什么地方,从什么地方开始。
-
使用参数r+对文件对象进行写操作的时候,从什么地方开始写入,由指针当前的位置进行决定。
[kiosk@foundation31 lianxi_0605]$ cat 01.py
f = open('/public/toto',mode='w')
f.close() # 使用参数w打开文件对象,并没有进行任何的操作
[kiosk@foundation31 lianxi_0605]$ cat /public/toto # 源文件中存在的源内容
1234lalaleledodowestos
123412341234
[kiosk@foundation31 lianxi_0605]$ python3 01.py # 运行之后
[kiosk@foundation31 lianxi_0605]$ cat /public/toto # 文件中的内容被清空了
[kiosk@foundation31 lianxi_0605]$
[kiosk@foundation31 lianxi_0605]$ cat /public/lala #文件内容
0123456789
[kiosk@foundation31 lianxi_0605]$ cat 01.py # 脚本内容
f = open('/public/lala',mode='r')
print(f.tell()) # 显示当前指针位置
f.seek(5,0) # 移动指针到指定位置
print(f.tell())
a = f.read() # 进行读操作
print(a) # 显示读取到的结果
[kiosk@foundation31 lianxi_0605]$ python3 01.py
0 # 刚开始的时候 指针在0 开头位置
5 # 将其启动到 5 位置(第五个字符)
56789 #读取到的内容就是从指针所在的下一个字符开始
3、文件定位以及修改指针的位置
文件定位:tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后
seek(偏移量 ,参考位置)方法改变当前文件的位置。
- 偏移量表示要移动的字节数(<0 表示向左偏移;>0表示向右偏移)。参考位置指定开始移动字节的参考位置。
- 如果参考位置被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
[kiosk@foundation31 lianxi_0605]$ cat 01.py # 脚本内容
f = open('/public/lala',mode='rb') # 打开文件对象
print(f.tell()) # 显示当前文件位置
f.seek(5,0) # 从开头向后移动5个字节
print(f.tell()) # 显示当前文件位置
f.seek(-2,1) # 从当前位置向移动2个字节
print(f.tell()) # 显示当前文件位置
f.seek(-1,2) # 从最后向前移动1个字节
print(f.tell()) # 显示当前文件位置
f.seek(0,0) # 移动到文件开头
print(f.tell()) # 显示当前文件位置
f.seek(0,2) # 移动到文件末尾
print(f.tell()) # 显示当前文件位置
f.close()
[kiosk@foundation31 lianxi_0605]$ cat /public/lala
0123456789 # 显示的文件内容
[kiosk@foundation31 lianxi_0605]$ python3 01.py # 显示每次移动输出的结果
0
5
3
9
0
10
4 、判断文件对象拥有的权限以及状态
f.readable() #文件对象是否可读,返回为True或者False
f.writable() #文件对象是否可写,返回为True或者False
f.closed #文件对象是否已经关闭,返回为True或者False
5、多种读取文件的方式
1 按行读取
f.readline()
#每次读取一行,f引用打开的文件对象
f.readline(count)
#每次读取一行中的count个字节,f引用打开的文件对象
2 按字节读取
f.read(count)
#每次读取文件中的count个字节,f引用打开的文件对象
3 读取文件内容,并返回一个列表,列表元素分别为文件的行内容
f.readlines()
[kiosk@foundation31 lianxi_0605]$ cat /public/toto # 文件内容
hahahahahah
lalalalalal
tototototot
[kiosk@foundation31 lianxi_0605]$ cat 01.py # 脚本内容
f = open('/public/toto',mode='r')
a = f.readlines()
print(a)
f.close()
[kiosk@foundation31 lianxi_0605]$ python3 01.py #运行结果 返回一个列表
['hahahahahah\n', 'lalalalalal\n', 'tototototot\n']
[kiosk@foundation31 lianxi_0605]$
6、上下文管理器
上下文管理器:打开文件,执行完with语句内容之后,自动关闭文件
格式:
with open(文件路径) as 变量:
<要进行的操作>
with open('/public/toto',mode='r') as f:
print('with 语句里面' ,f.closed)
print('with 语句外面' , f.closed)
#运行结果:
with 语句里面 False
with 语句外面 True # 当结束with 语句的时候,文件自动关闭
python3.x中可以同时打开多个文件进行操作
#同时打开文件/public/toto 以及文件/public/toto1
with open('/public/toto',mode='r') as f1 , open('/public/toto1' ,mode='w+') as f2:
content = f1.read() #读取第一个文件中的内容
print(content) # 显示第一个文件的内容
f2.write(content) # 将第一个文件的内容写入到第二个文件中
f2.seek(0,0)
print(f2.read()) # 显示第二个文件的内容
#输出结果:
111111222222
111111222222 # 成功将第一个文件的内容复制到第二个文件中
应用练习:
1 创建文件data.txt 文件共100000行,每行存放以一个1~100之间的整数
import random
with open('/public/date.txt',mode='w') as f1:
for i in range(100000):
f1.write(str(random.randint(1,100)) + '\n')
2 生成100个MAC地址并写入文件中,MAC地址前6位(16进制)为01-AF-3B
01-AF-3B-xx-xx-xx
注意:MAC地址为12位,由16进制数组成的
import random
import string
def mac1():
s1 = ['01','AF','3B']
s2 = [ ''.join(random.sample(string.hexdigits,2)).upper() for i in range(3)]
mac = '-'.join(s1 + s2)
return mac
with open('/public/MAC.txt','w') as f :
for i in range(100):
f.write(mac1() + '\n')
3-1. 生成一个大文件ips.txt,要求1200行,每行随机为172.25.254.0/24段的ip
import random
def ip():
s1 = '172.25.254.'
s2 = str(random.randint(0,255))+'/24'
return s1+s2
with open('/public/ips.txt','w') as f:
for i in range(1200):
f.write(ip() + '\n')
3-2. 读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
with open('/public/ips.txt','r') as f:
a = f.readlines()
a1 = set(a)
a2 = [(i,a.count(i)) for i in a1]
print(sorted(a2,key=lambda x:x[1],reverse=True)[:10])