一、文件管理
1、文件打开三部曲:
打开、操作、关闭
r: 只能读,不能写,
读取的文件不存在,会报错
r+:能读,能写,能追加,
文件不存在时报错
w: 只能写,不能读,
文件不存在新建文件,不报错
会清空覆盖文件内容,覆盖
w+:能读,能写,
会覆盖,
文件不存在时新建
a: 只能写,不能读
文件不存在新建文件,不报错
文件如果存在不会清空文件的内容,追加
a+:能读,能写,会追加,文件不存在时新建
#打开:
f = open('passwd''w')
#操作:
content = f.read()
f.write('westos')
#关闭文件:
f.close()
import random
f = open('data.txt', 'a+')
for i in range(10):
content = f.read()
num = random.randint(1, 100)
f.write('%d\n' % num)
f.close()
2、练习
import random
f = open('data.txt', 'w')
for i in range(10):
content = f.read()
num = random.randint(1, 100)
f.write('%d\n' % num)
print content #打印读的东西
f.close()
3、文件指针
文件指针标记从哪个位置开始读取数据,第一次打开文件时,通常文件指针会指向文件的开始位置,当执行了read方法后,文件指针会移动到读取内容的末尾
file = open('passwd')
text = file.read()
print text
print type(text)
print len(text)
print '*******'
# 移动文件指针到文件开头
file.seek(0)
text = file.read()
print len(text)
file.close()
4、正确读取大文件
file = open('passwd')
# 为什么要设定为无限循环:
# 因为我们不知道循环的条件
# 我们不知道文件到底有多少行
while True:
text = file.readline()
# 判断是否读取到了内容
# 如果文件指针到文件的最后一行,那么就读取不到内容了
if not text:
break
# 每读取一行的末尾已经有一个‘\n’
print text
file.close()
5、复制文件
打开一个已经有的文件,读取完整的内容,并写到另一个文件中去
# 源文件以只读的方式打开
file_read = open('passwd')
# 目标文件以只写的方式打开
file_write = open('passwd_copy','w')
# 从源文件中读取内容
text = file_read.read()
# 将读取到的内容写到目标文件
file_write.write(text)
# 关闭文件
file_read.close()
file_write.close()
6、读取二进制文件
rb wb ab
rb+ wb+ ab+
# 读取二进制文件的内容
f1 = open('good.jpg',mode='rb')
content = f1.read()
f1.close()
f2 = open('happy.png',mode='wb')
f2.write(content)
f2.close()
7、另一种方式打开文件
with open('passwd') as f:
lines = f.readline()
print lines
for line in lines:
print line
8、练习
- 生成一个大文件ips.txt,要求1200行, 每行随机为172.25.254.0/24段的ip;
- 读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
import random
def create_ips_file(filename):
ips = ['172.25.254.' + str(i) for i in range(1, 255)]
with open(filename, 'a+') as f:
for count in range(1200):
f.write(random.sample(ips, 1)[0] + '\n')
def sorted_by_ip(filename,count =10):
ips_dict = dict()
with open(filename) as f:
for ip in f:
if ip in ips_dict:
ips_dict[ip] += 1
else:
ips_dict[ip] = 1
sorted_ip = sorted(ips_dict.items(),
key=lambda x:x[1],reverse=True)[:count]
return sorted_ip
print sorted_by_ip('ips.txt')
二、os模块对文件的操作
1、对目录和文件的操作
import os
# 1,返回操作系统的类型,值为posix,是linux操作系统
#值为nt,是windows系统
print os.name
# 2,返回操作系统的详细
print os.uname()
# 3, 系统的环境变量
print os.environ
print os.environ.get('PATH')
# 4, 判断是否是绝对路径(不会判断文件或者目录是否存在)
print os.path.isabs('/tmp/westos')
print os.path.isabs('hello')
# 5,生成绝对路径
print os.path.abspath('hello.png')
print os.path.join('/home/kiosk','hello.png')
print os.path.join(os.path.abspath('.'),'hello.png')
# 6,获取目录名或者文件名
filename = '/home/kiosk/PycharmProjects/python/day08/hello.png'
print os.path.basename(filename) # 文件名
print os.path.dirname(filename) # 目录名
# 7,创建目录/删除目录
#os.mkdir('img')
#os.makedirs('img/file') # mkdir -p
#os.rmdir('img/file')
os.rmdir('img')
# 8, 创建文件/删除文加
os.mknod('westos.txt')
os.remove('westos.txt')
# 9,文件的重命名(mv)
os.rename('westos.txt','data.txt')
# 10, 判断文件或者目录是否存在
print os.path.exists('img')
print os.path.exists('data.txt')
# 11, 分离后缀名和文件名
print os.path.splitext('hello.png')
# 12, 将目录名和文件名分离
print os.path.split('/tmp/hello/hello.png')
2、练习
- 在当前目录新建目录img, 里面包含多个文件, 文件名各不相同(X4G5.png)
- 将当前img目录所有以.png结尾的后缀名改为.jpg.
import os
import random
import string
def gen_code(len=4):
# 随机生成4位文件名
li = random.sample(string.ascii_letters + string.digits, len)
# 将列表元素拼接成字符串
return ''.join(li)
def create_file():
# 随机生成多个文件名
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)结尾的文件
pngfiles = [filename for filename in os.listdir(dirname)
if filename.endswith(old_suffix)]
# 3.将文件名和后缀名分开,留下文件名
basefiles = [os.path.splitext(filename)[0] for filename in pngfiles]
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')