文件
“”"
r -默认打开文件为只读
-读取文件不存在,会报错
w -write only
-读取文件不存在,会创建新的文件
-读取文件存在,会覆盖原内容
a -write only
-读取文件不存在,会创建新的文件
-读取文年存在,不会删除原文件,会在其后添加新的内容
r+ -可读可写
-读取文件存在,默认情况下,从文件指针所在位置开始写入,并覆盖原文件内容
-读取文件不存在,会报错
w+ -可读可写
-读取文件不存在,会创建新的文件
-读取文件存在,会覆盖原内容
a+ -可读可写
-读取文件不存在,会创建新的文件
-读取文年存在,不会删除原文件,会在其后添加新的内容
“”"
#打开
f = open(’/tmp/passwd’,‘w’)
#操作
#文件指针所在的位置
print(f.tell())
#读取
print(f.read())
#写
print(f.write(‘Python1’))
#检测是否可读,是否可写
print(f.readable())
print(f.writable())
#关闭
f.close()
非纯文本文件的操作
如果要读取非纯文本文件(视频,音频和图片),需要通过二进制的方式进行读写
读取文本文件:
r w a r+ w+ a+ == rt wt at rt+ wt+ at+
读取二进制文件:
rb wb ab rb+ wb+ ab+
#先读取二进制文件内容
f1=open(’/home/kiosk/PycharmProjects/20181117/day07/2.jpg’,mode=‘rb’)
contect=f1.read()
f1.close()
f2=open(‘hello.jpg’,mode=‘wb’)
#写入要复制的文件读到的内容
f2.write(contect)
f2.close()
文件的常用操作
f = open(’/tmp/passwd’,mode=‘r’)
“”"
默认情况下读取文件的所有内容,小的文件直接用read
如果是一个大文件(>内存),readline()
read()括号内可以传参数,意思为读取到第几个字符
“”"
print(f.read(3))
print(f.readline()) # 一行一行读取
print(f.readline())
#读取文件内容,并返回一个列表,列表元素为文件的行内容
print(f.readlines())
f.close()
f=open(’/tmp/passwd’,mode=‘w’)
f.write() #从指针位置写入,写的就是字符串的内容
f.writelines([‘a’,‘b’]) #将列表中的每个元素写入文件
f.close()
f=open(’/tmp/passwd’,mode=‘rb’)
#指针的操作
print(f.tell())
print(‘1:’,f.read(3))
print(f.tell())
f.seek(2,1)
“”"
seek:移动指针
第一个参数:偏移量
第二个参数:
0:移动指针到文件开头
1:移动指针到当前位置
2:移动指针到文件末尾
“”"
f.close()
with
#上下文管理器:打开文件,执行完with语句内容后,自动关闭文件对象
#python2中with一次只能打开一个文件,python3一次可以打开多个,如下:
with open(’/tmp/passwd’) as f1,
open(’/tmp/passwd1’,mode=‘w+’) as f2:f2.write(f1.read())
f2.seek(0,0)
print(f2.read())
结果如图:
比较两种的效率:
import time
import string
import random
import functools
def timeit(fun):“”“这是一个装饰器timeit”""
@functools.wraps(fun) # 可以保留被装饰函数的函数名和帮助信息文档
def add_time(*args, **kwargs): # 接收可变参数和关键字参数“”“这是一个add_time函数”""
#在函数执行之前计时
start_time = time.time()
#执行函数
#fun(*args,**kwargs)
#函数有返回值时,将函数赋给res
res = fun(*args, **kwargs)
#在函数执行之后计时
end_time = time.time()
print(‘运行时间:%.6f’ % (end_time - start_time))
#返回res
return resreturn add_time
@timeit
def a1():with open(‘mac.txt’) as f1:
m=f1.read()
with open(‘a1.txt’,mode=‘w’) as f2:f2.write(m)
@timeit
def a2():with open(‘mac.txt’) as f1,open(‘a1.txt’,mode=‘w’) as f2:
f2.write(f1.read())
a1()
a2()
结果展示:
练习
创建文件
文件共一万行,每行存放一个1~100之间的整数
import random
f=open(‘theone.txt’,mode=‘w+’)
for i in range(10000):a=f.write(str(random.randint(1,100)))
f.write(’\n’)f.seek(0.0)
print(f.read())
f.close()
结果展示:
京东笔试题
1.生成一个大文件ips.txt,要求1200行,每行随机为172.25.254.0/24段的ip;
2.读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
import random
def creat_ip():with open(‘ips.txt’,mode=‘w’) as f1:
for i in range(1200):
a=‘172.25.254.’
a=a+str(random.randint(1,254))+’\n’
f1.write(a)def a_value(x):
return x[1]
def main():
creat_ip()
dic=[]
with open(‘ips.txt’) as f1:a = f1.read()
for i in range(1,255):i_count=a.count(‘172.25.254.%s’ %(i))
print(i_count)
dic.append([i,i_count])
print(dic)
dic=sorted(dic,key=a_value)
return [dic[-i] for i in range(1,11)] # [:10]
key=lambda x:x[1],reverse=True 使用匿名函数作为key值
print(main())
结果展示:
os
import os
#1.返回操作系统类型 值为:posix,是Linux系统,值为nt,是Windows系统
print(os.name)
#2.操作系统的详细信息
info=os.uname()
print(info)
print(info.sysname)
print(info.nodename)
#3.系统的环境变量
print(os.environ)
#4.通过key值获取环境变量对应的value值
print(os.environ.get(‘PATH’))
#5.判断是否为绝对路径 /tmp/passwd data.txt
print(os.path.isabs(’/tmp/passwd’))
#6.生成绝对路径
print(os.path.abspath(‘hello.png’))
print(os.path.join(’/home/kiosk’,‘hello.png’))
print(os.path.join(os.path.abspath(’.’),‘hello.png’))
#7.获取目录名或文件名
filename=’/home/kiosk/PycharmProjects/20181117/day09/hello.png’
print(os.path.basename(filename))
print(os.path.dirname(filename))
#8.创建目录 删除目录
os.mkdir(‘img’)
os.makedirs(‘img/file1/file2’)
os.rmdir(‘img’)
#9.创建文件 删除文件
os.mknod(‘00_ok.txt’)
os.remove(‘00_ok.txt’)
#10.文件重命名(mv)
os.rename(‘data.txt’,‘data1.txt’)
#11.判断文件或目录是否存在
print(os.path.exists(‘ips.txt’))
#12.分离后缀名和文件名
print(os.path.splitext(‘hello.png’))
#13.将目录和文件分离
print(os.path.split(’/tmp/hello/hello.png’))
练习
1.完成自动创建100个目录,目录名为学生学号,
学号前四位均为’0405’
学号总计为8位,举例如04050001
import os
for i in range(1,101):i=i/1000
os.mkdir(’/home/kiosk/PycharmProjects/2018.11.17/day09/学号/0405%.4d’ %(i*1000))
2.目录新建目录img, 里面包含多个文件, 文件名各不相同(X4G5.png)
将当前img目录所有以.png结尾的后缀名改为.jpg
import os
import string
import random
def gen_code(len=4):#随机生成4位的验证码
li = random.sample(string.ascii_letters + string.digits, len)
return ‘’.join(li)def create_file():
#随机生成100个验证码
li = {gen_code() for i in range(100)}
os.mkdir(‘img’)
for name in li:os.mknod(‘img/’ + name + ‘.png’)
#create_file()
def modify_suffix(dirname, old_suffix, new_suffix):“”"
:param dirname:操作的目录
:param old_suffix: 之前的后缀名
:param new_suffix: 新的后缀名
:return:
“”"
#1.判断查找的目录是否存在,如果不存在,报错
if os.path.exists(dirname):#2.找出所有以old_suffix(.png)结尾的文件
pngfile = [filename for filename in os.listdir(dirname) if filename.endswith(old_suffix)]
#pngfiles = filter(lambda filename:filename.endswith(old_suffix),os.listdir(dirname))
#3.将文件名和后缀名分开,留下文件名
basefiles = [os.path.splitext(filename)[0] for filename in pngfile]
print(basefiles)
#4.文件重命名
for filename in basefiles:#需要加上目录名
oldname = os.path.join(dirname,filename+old_suffix)
newname = os.path.join(dirname,filename+new_suffix)
os.rename(oldname,newname)
print(’%s命名为%s成功’ %(oldname,newname))else:
print(’%s不存在,不能操作…’ %(dirname))
modify_suffix(‘img’,’.jpg’,’.png’)