1.文件读取的三部曲:打开 —> 操作 ----> 关闭
可以先将文件复制到目录下 进行操作
[root@localhost mnt]# ls
passwd
第一步打开文件
f = open('/mnt/passwd')
第二步:操作
print(f)
关闭
f.close()
r(默认参数)
-只能读,不能写
-读取文件不存在 会报错
FileNotFoundError: [Errno 2] No such file or directory: '/mnt/westos’
f = open('/mnt/passwd' ) 文件是可以读取的,这里的 ‘r’ 默认时已经存在了,
# print(f)
con = f.read()
print(con)
f.close()
###如果在添加 r 的话是会出现报错的
f = open('/mnt/passwd' 'r' )
# print(f)
con = f.read()
print(con)
f.close()
Error: [Errno 2] No such file or directory: '/mnt/passwdr' 就会出现了报错的
在 默认是r 的状态下 是不可以写的 会出现报错的
f = open('/mnt/passwd' )
# print(f)
con = f.write('abs')
print(con)
f.close()
io.UnsupportedOperation: not writable
在文件不存在的时候,读取也是会出现报错的
f = open('/mnt/westos' ) 这个/mnt/westos文件不存在的时候是会出现报错的
# print(f)
con = f.read()
print(con)
f.close()
Error: [Errno 2] No such file or directory: '/mnt/westos'
w(写)
-write only
-文件不存在的时候,会自动创建新的文件
-文件存在的时候,会清空文件内容并写入新的内容
f = open('/mnt/passwd' ,'w' ) 在是w属性的时候,只使用read是会出现报错的
con = f.read()
print(con)
f.close()
在是w的状态下是可以写的,并且能够输出字节
f = open('/mnt/passwd' ,'w' )
con = f.write('hello python')
print(con)
f.close()
实验效果
12
并且文件不存在的时候,会自动创建新的文件
当文件存在的时候,会情况之前的文件内容并写入新的内容
a(追加)
-write only
-写:不会清空文件的内容,会在文件末尾追加
-写:文件不存在,不会报错,会创建新的文件并写入内容
f = open('/mnt/westos' ,'a' ) 是追加的情况下,是不可以读取的会出现报错的
con = f.read()
print(con)
f.close()
当文件已经存在的时候,不会清空文件的内容,会在文件末尾追加
当文件不存在的时候,不会报错,会写入新的文件及其内容
r+
-r/w
-文件不存在,报错
-默认情况下,从文件指针所在位置开始写入
当是r+的状态 可以读取也可以写入
f = open('/mnt/redhat' ,'r+' ) 可以读取
con = f.read()
print(con)
f.close()
实验效果
hello boy and girl
当文件已经存在的情况下,会从文件指针所在的位置开始写入
当文件不存在的是会出现报错的
f = open('/mnt/docker' ,'r+' )
con = f.write('hello python')
print(con)
f.close()
Error: [Errno 2] No such file or directory: '/mnt/docker'
w+
-r/w
-文件不存在,不报错
-会清空文件内容
当文件存在的时候,会清空文件文件内容,可以自行写入文件内容
当文件不存在的时候,不报错
a+
-r/w
-文件不存在,不报错
-不会清空文件,在末尾追加
当文件不存在的时候,写入或者查看不报错
当文件已经存在的时候,不会清空文件内容,会一直在末尾追加
告诉当前的文件指针所在的位置 print(f.tell())
f = open('/mnt/westos' ,'a+' )
con = f.write('hello world')
print(con)
print(f.tell())
f.write('hello boy')
print(f.tell())
f.close()
实验效果
11
55
64
判断文件对象拥有的权限
print(f.readable())
print(f.writable())
读取图片 音频 视频(非纯文本文件)需要通过二进制的方式读取和写入
-读取纯文本
r r+ w w+ a a+ == rt rt+ wt wt+ at at+
-读取二进制文件
rb rb+ wb wb+ ab ab+
在这里以图片作为案例
读取文件内容,按照文件内容的大小分别有不同的的读取方式
小的文件直接使用read读取即可
大的文件(文件的大小>=内存大小)
第一种,按行读取
f = open('/mnt/passwd','rb+')
print(f.readline())
第二种,按字节读取
f = open('/mnt/passwd','rb+')
print(f.read(3)) 读取第三个字节
print(f.tell())
读取文件内容,并返回一个列表,列表元素分别为文件的行内容
f = open('/mnt/passwd','rb+')
print(f.readlines())
[b'hello python']
指针的移动
seek:指针移动
第一个参数:偏移量 >0:代表向后移动 <0 代表向前移动
第二个参数:
0:移动指针到文件开头
1:当前位置
2:移动指针到末尾
f = open('/mnt/passwd','rb+')
print(f.readlines())
f.seek(1,2)
练习
读取内容,返回一个列表,去掉后面的\n
f = open('/mnt/passwd')
print(list(map(lambda x:x.strip(),f.readlines())))
print([line.strip() for line in f.readlines()])
f.close()
创建文件data.txt 文件共100000行,每行存放以一个1~100之间的整数
import random 随机模块
f = open('data.txt','a+') 创建一个新的文件
for i in range(100000): 循环100000次里边的寻找1,100的随机数
f.write(str(random.randint(1,100)) + '\n')
f.seek(0,0) 指针移到文件开头的位置,方便查看
print(f.read())
f.close()
上下文管理器:打开文件,执行完with语句内容之后,自动关闭文件
with open('/mnt/passwd') as f :
print(f.read()) 创建新的文件并且阅读它
# print('with里面的语句:',f.close())
# print(f.close())
print('after with语句',f.close())
实验效果一部分
after with语句 None
将第一个文件的内容写道第二个文件中
with open('data.txt') as f,open('data2.txt','w+') as f2:
f2.write(f.read()) f2所写的就是f所看到的
f2.seek(0,0) 将f2放置在最前面
print(f2.read())
如何生成100个MAC地址并写入文件中,MAC地址前6位(16进制)为01-AF-3B
格式为
01-AF-3B-xx-xx-xx
-xx
01-AF-3B-xx-xx-xx
import string
import random #需要随机数和字符串
def creat_Mac():
MAC='01-AF-3B'
hex_num = string.hexdigits 生成所有的随机数
for i in range(3): MAC地址总共三6位,而题目已经给出了三位,现在只需要再循环三位就行
x = random.sample(hex_num,2)
xp = '-' + ''.join(x).upper() 因为MAC地址都是大写的,所以要全部改为大写的
MAC +=xp
return MAC 返回一个MAC地址数值,并且不断的循环
def mac(): 主函数
with open('mac.txt','w') as f: 写一个新的文件,之前的MAC地址数值放到这个文件里边
for i in range(100):
mac = creat_Mac() 接受之前的mac文件
print(mac)
f.write(mac + '\n') 换行,如果不进行换行的话,是会导致生成的文件,全部在一起,查看很麻烦
mac() 最后调用函数。
1、生成一个大文件ips.txt,要求1200行,每行随机为172.25.254.0/24段的ip
2、读取ips.txt文件统计这个文件中ip出现频率前10的ip
import random
def creat_ip():
ip='172.25.254' ###在这里的ip是一个字符串
n=random.randint(0,255) ###生成一个0到255的随机ip
sn ='.' + str(n)+'/24' ## 在这里转换为同类型才能相加
ip +=sn
return ip ## 持续循环并且相加
def ips_num():
with open('ips.txt','w') as f: ### 创建一个新的文件目的是将生成的ip放入里边
for i in range(1200):
ips = creat_ip() ###接受所生成的ip
print(ips)
f.write(ips + '\n') ###换行输出
# ips_num()
def sorted_ip(filename,count=10): ### filenmae:创建一个新文件 count=10 :表示10行,题目中所说的是10行,当然多少行的都是可以的。
ips_dict = dict() ###方便统计放入一个地址
with open(filename) as f: ##创建新文件
for ip in f:
if ip in ips_dict: ##如果这个ip在这个字典里边 加1
ips_dict[ip] +=1
else: ##不在 就是第一次,等于1
ips_dict[ip]=1
sorted_ip = sorted(ips_dict.items(),key=lambda x:x[1],reverse =True)[:10] ###排序 ps_dict.items(),key=lambda x:x[1] 字典里边排序给一个key,返回一个value值 reverse =True 倒叙
return sorted_ip
print(sorted_ip('ips.txt'))