一、文件的基本操作
1、文件打开的三个步骤:
1、打开
2、操作
3、关闭(如果不关闭会占有文件描述符)
f = open('/mnt/python')
print(f.read()) #查看文件的内容
f.close()
二、文件铐的读写操作
参数 | 是否能进行读写操作 | 文件不存在进行的操作 |
r | 只读不写 | 文件不存在,会进行报错 |
r+ | 可以进行读写操作 | 文件不存在会进行报错,默认情况下,从文件指针所在的位置开始写入 |
w | 只能进行写的操作 | 会清空文件之前的内容,文件不存在,不会报错,会创建新的文件 |
w+ | 可以进行读写操作 | 会清空文件的内容,文件不存在,不会进行报错,会创建新的文件 |
a | 只能进行只写操作 | 不会清空文件内容,文件不存在,会进行报错 |
a+ | 可以进行文件的速写操作 | 不清空文件的内容,在末尾进行追加,不进行报错 |
1、a的使用
f = open('/mnt/python','a') #'a'不会清空文件的内容,在文件的尾加上追加新的内容
print(f)
print(f.write('redhat\n'))
f.close()
2、a+的使用方法
#1.打开文件
f = open('/mnt/python','a+') ##表示追加内
#2.操作
f.write('haha\n') ##之间追加需要追加的内容
print(f.tell())
f.close()
3、w的使用
f = open('/mnt/python','w') #'w'会清空文件之前的内容并写入新的内容
print(f)
print(f.write('redhat\n'))
f.close()
4、文的操作方法
#2.操作
#1.打开文件
f = open('/mnt/python')
#如何判断当前文件对象所拥有的权限
print(f.readable()) #查看文件是否有读的权限
print(f.writable()) #查看文件是否有读的权限
结果:(只有为真或者为假)
True
False
5、判断指针所在的位置
#1.打开文件
f = open('/mnt/python')
#2.操作
#判断指针所在的位置
# print(f.tell()) #读取文件的内容从第一行开始
# print(f.read())
# print(f.tell()) #读完文件的内容(最后一个字符所在的位置)
# print(f.read())
5、读取二进制文件
f1 = open('/mnt/happy.jpg',mode = 'rb')
content = f1.read()
f1.close()
#写入需要复制的内容
f2 = open('/mnt/westos.jpg',mode='wb')
f2.write(content)
f2.close()
6、按行读取
# """
# 默认情况下读取文件 小文件:直接用read读取
# 如果是一个大文件(size>=mem):readline()
# """
# 按行读取
f = open('/mnt/python','rb+')
# print(f.readline()) ##读取第一行的内容
# print(f.readline()) ##读取第二行的内容
# print(f.readline()) ##读取第三行的内容
# print(f.readline()) ##当读取的内容为空是会返回 b''
# print(f.readline())
#
结果:
b'redhat\n'
b'*******\n'
b'hahahahahahahahahahahahahaha\n'
b''
b''
b''
7、按字节读取
# f = open('/mnt/python','rb+')
print(f.read(20)) ##读取20个字节的内容
结果:
b'redhat\n*******\nhahah'
8、读取文件内容并反回一个列表
# # 读取文件内容,并返回一个列表 列表元素分别为文件的行内容
# # 读取一个文件,返回一个列表,去掉后面的\n
f = open('/mnt/python','rb+')
print(f.readlines()) ##表示读取所有的行的内容
结果:
[b'redhat\n', b'*******\n', b'hahahahahahahahahahahahahaha\n']
9、指针的移动
f = open('/mnt/python','rb+')
print(f.read(100)) ##表示读取100个字符
print(f.tell()) ##表示指针所在的位置
f.seek(0,0) ##第一个0表示指针移动的方向向前移 第二个0表示指针移动到文件的开头
print(f.tell())
f.seek(0, 1) ##第一个0表示指针移动的方向向前移 第二个0表示指针移动到文件的当前位置
print(f.tell())
f.seek(1,2) ##第一个1表示指针移动的方向向后移 第二个2表示指针移动到文件的末尾
print(f.tell())
f.close()
# seek():指针的移动
# 第一个参数:偏移量 >0:向后移动 <0:向前移动
# 第二个参数:
# 0:移动到文件开头
# 1:当前位置
# 2:移动到文件的末尾
结果:
b'redhat\n*******\nhahahahahahahahahahahahahaha\n'
44
0
0
45
10、文件只有读的权限没有写的权限
f = open('/mnt/python', 'r')
print(f.writable())
print(f.readable())
f.close()
#文件有读写的权限
f = open('/mnt/python', 'r+')
print(f.writable())
print(f.readable())
f.close()
结果:
False
True
True
True
11、w的使用方法
#**********w***********
#只能进行写操作
#会清空文件之前的内容
#文件不存在,不会进行报错,会创建新的文件,并进行写操作
f = open('/mnt/python', 'w')
print(f.writable())
print(f.readable())
f.write('hehe\n')
f.seek(0)
f.close()
结果:
True
False
12、w+的使用方法
#**********w+***********
#只能进行写操作
#会清空文件之前的内容
#文件不存在,不会进行报错,会创建新的文件,并进行写操作
f = open('/mnt/python', 'w+')
print(f.writable()) ##查看文件是否有写的权限
print(f.readable()) ##查看文件是否有读的权限
f.write('******\n') ##在文件中写的内容
f.seek(0)
print(f.read())
f.close()
结果:
True
True
******
13、a的使用方法
#**********a***********
#只能进行写操作
#不会清空文件之前的内容
#文件不存在,会进行报错
f = open('/mnt/python', 'a')
print(f.writable()) ##查看文件是否有写的权限
print(f.readable()) ##查看文件是否有读的权限
f.write('@@@@@@\n') ##写入需要添加的内容
f.seek(0)
f.close()
结果:
True
False
14、a+的使用方法
#**********a+***********
#文件进行可读可写操作
#不会清空文件之前的内容,在末尾追加
#文件不存在,会进行报错
f = open('/mnt/python', 'a+')
print(f.writable()) ##查看文件是否有写的权限
print(f.readable()) ##查看文件是否有读的权限
f.write('%%%%%\n') ##在文件中写的内容
f.seek(0)
print(f.read())
f.close()
结果:
True
True
******
hehe
@@@@@@
%%%%%
作业练习:
(1)、#创建文件data.txt 文件共有100000行
#每行存在一个1~100之间的整数
import random
f = open('data.txt','a+') ##创建data.txt 文件
for i in range(100000): ##设置文件的行数
f.write(str(random.randint(1,100)) + '\n') ##random.randibt(1,100)表示随机生成1~100之间的数
f.seek(0,0) ##表示光标移动到行首的位置
print(f.read())
f.close()
(2)、# 生成100个MAC地址并写入文件中,MAC地址前6位(16进制)为01-AF-3B
# 01-AF-3B-xx-xx-xx
# -xx
# 01-AF-3B-xx
# -xx
# 01-AF-3B-xx-xx
# -xx
# 01-AF-3B-xx-xx-xx
import string
import random
def create_mac():
mac = '01-AF-3B'
key_name = string.hexdigits ##随机生成 0123456789abcdefABCDEF
print(key_name)
for i in range(3):
n = random.sample(key_name,2) ##在0123456789abcdefABCDEF之间选出两个数 (从16进制的字符串中随机选择两个数字返回值是一个列表)
sn = '-' + ''.join(n).upper()
mac += sn
return mac
def main():
with open('mac.txt','w') as f: ##生成mac.txt文件
for i in range(100):
mac = create_mac()
print(mac)
f.write(mac + '\n') ##将生成的mac地址写入文件中
main()
题目补充:
import string
key_name = string.hexdigits ##随机生成 0123456789abcdefABCDEF
print(key_name)
结果:
0123456789abcdefABCDEF
import random
n = random.sample(key_name,2) ##在0123456789abcdefABCDEF之间选出两个数
print(n)
结果:
['4', 'C']
(3)、题目要求:
生成一个大文件ips.txt,该文件的要求为1200行,每行随机为172.25.254.0/24
段的IP,读取ips.txt文件统计这个文件中IP出现的频率排名前10的IP
题目分析:
1、使用open进行文件的打开,使用'w+',当文件不存在时候可以进行文件的
创建,
2、使用for循环,进行对文件的写入,进行字符的拼接,网段后面的数字进行
随机数的生成。
3、对文件内容进行逐行煸历,进行文件的逐行煸历,使用with open('ips_txt') as f
for ip in f:。
3、进行排序函数的编辑
4、使用sorted函数进行所有的IP出现的次数进行从小到大的排序
5、对排好的列表进行切片操作,找出排名故后10的IP
"""
import random
import os
f = open('ips.txt','w+')
content = []
for i in range(1200):
num = random.randint(0,255)
num2 = '172.25.254.' + str(num)
f.writelines(num2 + '\n')
def count_ip(x):
return x[1]
dict_ip1 = {}
with open('ips.txt') as f:
for ip in f :
if ip not in dict_ip1:
dict_ip1[ip] = 1
else:
dict_ip1[ip] += 1
list_ip = sorted(dict_ip1.items(),key=count_ip)
result_ip = list_ip[::-1][:10]
print(result_ip)
结果:
[('172.25.254.60\n', 11), ('172.25.254.213\n', 10), ('172.25.254.66\n', 10), ('172.25.254.173\n', 10), ('172.25.254.93\n', 10), ('172.25.254.212\n', 9), ('172.25.254.88\n', 9), ('172.25.254.144\n', 9), ('172.25.254.230\n', 9), ('172.25.254.46\n', 9)]
三、上下文管理器:打开文件 执行完with语句后 自动关闭文件
1、上下文的基本格式
f = open('/mnt/python')
print(f.read())
with open('/mnt/python') as f: ##with open('/mnt/python') as f: 等同于 f = open('/mnt/python')
print(f.read())
print(f.closed)
2、将第一个文件的内容写入第二个文件中
with open('/mnt/python') as f,open('passwd','w+') as f2:
f2.write(f.read())
f2.seek(0,0)
print(f2.read()) ##查看f2的内容
结果:
haha
python2版本中的用法
"""
python2.x
with open('/tmp/passwd') as f:
content = f.read()
with open('/passwd','w+') as f2:
f2.write(content)
"""
3、读取一个文件,返回一个列表,去掉后面的\n
方法一:
f = open('/mnt/python')
print(list(map(lambda x:x.strip(),f.readlines())))
结果:
['haha', '']
方法二:
f = open('/mnt/python')
print([line.strip() for line in f.readlines()])
f.close()
结果:
['haha', '']
方法一、
方法二、
练习题:
"""
# 创建文件data.txt 文件共有100000行
# 每行存放一个1~100之间的整数
"""
import random
f = open('date.txt','a+')
for i in range(100000):
f.write(str(random.randint(1,100)) + '\n')
f.seek(0,0)
print(f.read())
f.close()