python---文件读写和os模块

一.文件的读写

1>.文件打开的模式选择
r:(默认)
    - 只能读,不能写
    - 读取文件不存在,会报错
    FileNotFoundError: [Errno 2] No such file or directory:

w:
    - write only
    - 文件不存在,不报错,并创建新的文件
    - 文件存在,会清空文件内容并写入新的内容

a:
    - write only
    - 写:文件不存在,不报错,并创建新的文件
    - 写:不会清空原文件的内容,会在文件末尾追加

a+:
    - rw
    - 文件不存在,不报错
    - 不会清空文件内容,在末尾追加

r+:
    - 读写
    - 文件不存在,报错
    - 默认情况下,从文件指针所在的位置开始写入

w+:
    -rw
    -文件不存在,不报错
    -会清空文件内容
2>.文件的简单读写操作

文件使用open()方式打开,一定要关闭文件对象,使用close()方法

文件的读取操作  打开---操作---关闭

f=open('/tmp/passwd4','r+')  #打开文件

print(f.readable())   	     #查看文件是否有读的权限
print(f.writable())          #查看文件是否有写的权限

f_w=f.write('kai xin bu hui jia')	#给文件写入内容

content=f.read()    #读取文件内容
print(content)

print(f.tell())     #查看文件指针的位置

f.close()
3>.文件的常用读写操作

文件的读取操作open()

f = open('/tmp/passwd', 'r')
默认情况下读取文件的所有内容,小的文件,直接用read读取即可;
如果是一个大文件(文件大小>内存大小) 使用readline()类似于head -c
print(f.read(3)) 	#读取文件指针所在位置的3个字符

print(f.readline())	# 每次读取一行内容

print(f.readlines())	# 读取文件内容,返回一个列表,列表元素分别为文件的行内容

print(f.readable())	#判断文件是否有读取的能力

# 对于每一行,去掉后面的'\n' ---(列表生成式 map())
print([line.strip() for line in f.readlines()])
print(list(map(lambda x:x.strip(),f.readlines())))

f.close()

文件的写操作和指针的移动

# seek:移动指针
     第一个参数:偏移量>0:代表向后移动 <0:代表前移动
     第二个参数:
         0:移动指针到文件开头
         1:当前位置
         2:移动指针到文件末尾

f = open('/tmp/passwd','rb')
f.write('hello')	 	#从指针所在位置写入,写的就是字符串的内容
f.writelines(['a','b']) 	#将列表中的每个元素写入文件
f.writable()			#判断文件是否有写的能力

print(f.tell())		#查看指针所在的位置

f.seek(0,2)		#更改指针所在的位置到文件末尾,指针偏移量为0

print(f.tell())
f.close()
4>.非纯文本文件的读取操作

非纯文本文件的读取

如果读取图片,音频或视频(非纯文本文件),需要通过二进制的方式进行读取与写入
-读取文本文件
r r+ w w+ a a+ == rb rb+ wb wb+ ab ab+
-读取二进制文件
rb rb+ wb wb+ ab ab+

非纯文本文件的打开及复制

# 先读取二进制文件内容,选择文件打开模式
f1 = open('1111.jpg', mode='rb')
content = f1.read()
f1.close()

f2 = open('hello.jpg', mode='wb')
f2.write(content)	# 写入要复制的文件读到的内容
f2.close()
4>.文件的打开方式with()

上下文管理器:打开文件,执行完with语句内容之后,自动关闭文件对象

with open('/tmp/passwd') as f1, open('/tmp/passwdbackup','w+')as f2:
    f2.write(f1.read())	# 将第一个文件的内容写入第二个文件中
     f2.seek(0,0)
     f2.read()

通过yeild实现文件的读取

def bylineread(fimename):
    with open(fimename) as f:
        line = f.readline()
        while line:
            yield line
            line = f.readline()
# read是一个生成器对象
read = bylineread('data1.txt')
print(read)
# 1.next读取生成器内容
print(next(read))
print(next(read))
# for
for item in read:
    print(item)
# 文件对象是可以for循环遍历的
from collections import Iterable
f = open('data1.txt')
print(isinstance(f,Iterable))
for i,item in enumerate(f):
    if i == 10:
        break
    print(i,item)

文件应用1:创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数
python---文件读写和os模块
文件应用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

[1]
python---文件读写和os模块
[2]
python---文件读写和os模块
文件应用3:

 1. 生成一个大文件ips.txt,要求1200行, 每行随机为172.25.254.0/24段的ip;
 2. 读取ips.txt文件统计这个文件中ip出现频率排前10的ip;

python---文件读写和os模块

二 函数os模块

1>函数os模块的一些基本使用方法
import os
# 1.返回操作系统类型 值为:posix,是Linux操作系统 值为nt,是windows操作系统
print(os.name)
print('Linux' if os.name == 'posix' else 'Windows')

# 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/passwd3'))
print(os.path.isabs('hello'))

# 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.创建目录 删除目录
# mkdir mkdir -p
os.makedirs('img/file1/file2')
os.mkdir('img')
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'))
2>函数os模块的应用

os模块的应用1:

完成自动创建100个目录,目录名称为学生学号,
学号的前四位均为‘0405’,
学号总计为8位。举例如学号04050001

python---文件读写和os模块
os模块的应用2:

 1. 在当前目录新建目录img, 里面包含多个文件, 文件名各不相同(X4G5.png)
 2. 将当前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():
    # 随机生成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','.png','.jpg')

python---文件读写和os模块
os模块的应用3:

读入一个Python程序,将其单行的注释(即 每一行“#”后面的内容)删除后保存

python---文件读写和os模块

os模块的应用4:

2. 随机生成100个学生的成绩保存在文件scores.txt文件中;
	2). 从文件中读出学生的成绩,输出最高、最低,以及平均成绩(平均成绩为小数)。
	3). 从文件中读出学生的成绩,统计90分以上学生的人数并输出。
	4). 求出这次考试的平均成绩,并统计各分数段的人数(优秀:≥90,良好:≥80,中等:≥70,及格:≥60,不及格:<60)。
 	5). 将统计结果保存到数据文件statictic.txt中