01_文件
"""
1.文件读取的三部曲:打开--->操作---->关闭
"""
# 打开文件
f = open('/tmp/passwd')
# 操作
content = f.read() #f为文件对象,不能直接打印出文件内容
print(content)
# 关闭
f.close()
"""
r:(默认)
-只能读,不能写
-读取文件不存在,会报错
FileNotFoundError: [Errno 2] No such file or directory:
w:
-write only
-文件不存在,不报错,并创建新的文件
-文件存在,会清空文件内容并写入新的内容
a:
-write only
-写:文件不存在,不报错,并创建新的文件
-写:不会清空原文件的内容,会在文件末尾追加
a+:
-rw
-文件不存在,不报错
-不会清空文件内容,在末尾追加
r+:
-读写
-文件不存在,报错
-默认情况下,从文件指针所在的位置开始写入
w+:
-rw
-文件不存在,不报错
-会清空文件内容
# 文件内容的读写都是根据指针所在位置开始操作的
"""
# 写操作
f=open('/tmp/passwd','w')
f.write('hello')
f.close()
f=open('/tmp/passwd','w')
# 判断文件对象拥有的权限
print(f.readable())
print(f.writable())
f.close()
# 追加操作
f=open('/tmp/passwd','a')
f.write('python')
f.close()
# r+操作
f=open('/tmp/test','r+')
print(f.readable()) # 可读可写
print(f.writable())
print(f.tell()) #起始时,指针位于开头
print(f.read())
print(f.tell()) #读操作执行完后,指针位于末尾
f.write('hello') #在末尾添加'hello'
print(f.tell()) #指针+5
f.close()
# w+、a+用法和w、a用法类似,只不过多了读权限
02_非纯文本文件的读取
"""
如果读取图片,音频或视频(非纯文本文件),需要通过二进制的方式进行读取与写入
-读取文本文件
r r+ w w+ a a+ == rt rt+ wt wt+ at at+
-读取二进制文件
rb rb+ wb wb+ ab ab+
"""
# 先读取二进制文件内容
f1=open('111.jpg','rb')
content=f1.read()
f1.close()
f2=open('hello.jpg','wb')
# 写入要复制的文件读到的内容
f2.write(content)
f2.close()
03_文件的常用操作
"""
默认情况下读取文件的所有内容,小的文件,直接用read读取即可
如果是一个大文件(文件大小>内存大小) readline()
"""
f=open('/tmp/test')
print(f.read(3))
# 类似于head -c,读取前几个字符
print(f.read(3))
print(f.tell()) # 查看指针所处位置
# 每次读取一行内容
print(f.readline())
print(f.readline())
f.close()
f=open('/tmp/test')
# 读取文件内容,返回一个列表,列表元素分贝为文件的行内容
print(f.readlines())
f.close()
# 对于每一行,去掉后面的'\n' ---(列表生成式 map())
f=open('/tmp/test')
# map高阶函数
# print(list(map(lambda x:x[:-1],f.readlines())))
# 列表生成式
print([i.strip() for i in f.readlines()])
f.close()
"""
seek:移动指针
第一个参数:偏移量>0:代表向后移动 <0:代表前移动
第二个参数:
0:移动指针到文件开头
1:当前位置
2:移动指针到文件末尾
"""
f=open('/tmp/test','r')
print('1:',f.read(3))
print(f.tell())
f.seek(1,0) #移动到开头后一位
print(f.tell())
f.close()
# 若seek第二参数为1、2时,文件的打开方式必须为二进制
# 否则会报错
f=open('/tmp/test','r')
print('1:',f.read(3))
print(f.tell())
f.seek(1,1)
print(f.tell())
f.close()
04_文件练习01
"""
创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数
# 要求能同时读取data.txt
"""
代码:
import random
f=open('data.txt','w+')
for i in range(100000):
f.write(str(random.randint(1,100))+'\n')
f.seek(0,0)
print(f.readlines())
f.close()
05_with
"""
上下文管理器:打开文件,执行完with语句内容之后,自动关闭文件对象
"""
with open('/tmp/test') as f:
print('with语句里面',f.closed)
print(f.read())
print('with语句外面',f.closed)
# f.closed判断文件是否关闭
#python3/python2(只能这么写)
with open('/tmp/passwd') as f1:
content = f1.read()
with open('/tmp/passwdbackup','w+') as f2:
f2.write(content)
#python3可以同时打开两个文件
with open('/tmp/passwd') as f1,\
open('/tmp/passwdbackup','w+')as f2:
# 将第一个文件的内容写入第二个文件中
f2.write(f1.read())
# f2.seek(0,0)
# f2.read()
06_通过yeild实现文件的读取
def bylineread(filename):
with open(filename)as f:
res=f.readline()
while res:
yield res
res=f.readline()
# read是一个生成器对象
read=bylineread('/tmp/test')
print(read)
# 1.next读取生成器内容
print(next(read))
print(next(read))
# 文件对象是可以for循环遍历的
for item in read:
print(item)
# 应用第三方函数库
from collections import Iterable # 导入对象数据类型
f=open('data.txt')
print(isinstance(f,Iterable)) #判断变量是否为对象
for i,v in enumerate(f):
if i==10: # 取前10个数据
break
else:
print(i,v)
07_文件练习02
"""
生成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
# mac地址为12位
"""
代码:
import string
import random
# 生成16进制的数
code_num=string.hexdigits
# 随机生成一个MAC地址的函数
def creat_mac():
mac='01-AF-3B'
for i in range(3):
# 从16进制字符串中随机选出2个数来(返回值为列表)
# 拼接列表中的内容,将小写字母转换为大写
s='-'+''.join(random.sample(code_num,2)).upper()
mac+=s
return mac
# 主函数,随机生成100个MAC地址
def main():
# 以写的方式打开文件
with open('mac.txt','w')as f:
for i in range(100):
# 每生成一个MAC地址,存入文件(注意换行)
f.write(creat_mac()+'\n')
main()
08_文件练习_京东笔试题
"""
京东二面编程题
# 1. 生成一个大文件ips.txt,要求1200行, 每行随机为172.25.254.0/24段的ip;
# 2. 读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
"""
代码:
import random
# 生成存放1200行ip地址的文件的函数
def creat_ips(filename):
ip='172.25.254.'
with open(filename,'w')as f:
for i in range(1200):
f.write(ip+str(random.randint(0,255))+'\n')
# 选出ip出现频率前10的ip的函数
def ip_maxnum(filename):
# 建立一个空字典
d={}
# 调用生成文件的函数
creat_ips(filename)
with open(filename)as f:
# 依次遍历返回文件内容的列表
for key in f.readlines():
# 若ip存在字典的key值中,则其对应的value值加一
#否则将该ip附给字典的key值,对应value值为一
if key.strip() in d:
d[key.strip()]+=1
else:
d[key.strip()]=1
将字典的key,value值组成元组,按照value的大小降序
li=sorted(d.items(),key=lambda x:x[1],reverse=True)
打印前10个ip
print(li[:10])
ip_maxnum('ips.txt')
# 对于字典里面嵌套字典进行排序
d = {
'003':{
'name':'apple1',
'count':100,
'price':10
},
'002':{
'name':'apple2',
'count':200,
'price':2
}
}
# 按嵌套字典里的'count'的value值升序
print(sorted(d.items(),key=lambda x:x[1]['count']))
# 按嵌套字典里的'price'的value值升序
print(sorted(d.items(),key=lambda x:x[1]['price']))
09_读取文件方式效率比较
#调用在装饰器章节编写的计时器
import functools
import time
def timeit(fun):
"""这是一个装饰器timeit"""
@functools.wraps(fun) #可以保留被装饰函数的函数名和帮助信息文档
def wrapper(*args, **kwargs): # 接收可变参数和关键字参数
"""这是一个wrapper函数"""
# args:元组 kwargs:字典
# 在函数执行之前
start_time = time.time()
# 执行函数
res = fun(*args, **kwargs)
# 函数执行之后
end_time = time.time()
print('运行时间为:%.6f' % (end_time - start_time))
return res
return wrapper
#判断文件复制是依次打开两个文件效率高还是同时打开两个文件的效率高
@timeit
# 依次打开两个文件
def copy1(old_file,new_file):
with open(old_file)as f:
content=f.read()
with open(new_file,'w')as f:
f.write(content)
@timeit
# 同时打开两个文件
def copy2(old_file,new_file):
with open(old_file)as f1,\
open(new_file,'w')as f2:
f2.write(f1.read())
copy1('data.txt','data_1.txt')
copy2('data.txt','data_2.txt')
# 对比可知,同时打开两个文件效率高