python --文件操作

文件操作

打开【open】

操作【operating】

关闭【close】

打开文件:

f = open('/etc/passwd') 

读文件:

f.read()

写文件:

f.write()

关闭文件:

f.close()

查看文件的可读写状态:

readable()  # 是否可读
writable()  # 是否可写

打开模式:

打开模式只可以读只可以写读写兼备
文本模式rwar+w+a+
二进制模式rbwbabrb+ / (r+b)wb+ / (w+b)ab+ / (a+b)

r:
    1. 打开文件进行“只读”操作,即只能从文件读取内容
    2. 若欲操作的文件不存在,则打开失败
    3. 成功打开文件时,文件指针位于文件开头
    4. 打开文件后,不会清空文件内原有内容
    5. 可从文件中任意位置读取内容
 
r+:
    1. 打开文件进行“读写”操作,即既可读取,又可写入
    2. 若欲操作的文件不存在,则打开失败
    3. 成功打开文件时,文件指针位于文件开头
    4. 打开文件后,不会清空文件内原有内容
    5. 无论是读取内容还是写入内容,都可在文件中任意位置进行,且进行写入操作时,会覆盖原有位置的内容
 
w:
    1. 打开文件进行“只写”操作,即只能向文件写入内容
    2. 若欲操作的文件不存在,则新建文件
    3. 成功打开文件时,文件指针位于文件开头
    4. 打开文件后,会清空文件内原有的内容
    5. 可向文件中任意位置写入内容,且进行写入操作时,会覆盖原有位置的内容
 
w+:
    1. 打开文件进行“读写”操作,即既可读取,又可写入
    2. 若欲操作的文件不存在,则新建文件
    3. 成功打开文件时,文件指针位于文件开头
    4. 打开文件后,会清空文件内原有的内容
    5. 无论是读取内容还是写入内容,都可在文件中任意位置进行,且进行写入操作时,会覆盖原有位置的内容 
 
a:
    1. 打开文件进行“追加”操作,即只能向文件写入内容
    2. 若欲操作的文件不存在,则新建文件
    3. 成功打开文件时,文件指针位于文件结尾
    4. 打开文件后,不会清空文件内原有内容
    5. 只能向文件末尾追加(写)内容
 
a+:
    1. 打开文件进行“读写”操作,即既可读取,又可写入
    2. 若欲操作的文件不存在,则新建文件
    3. 成功打开文件时,文件指针位于文件结尾
    4. 打开文件后,不会清空文件内原有内容
    5. 读取内容时,可以在任意位置进行,但写入内容时,只会追加在文件尾部 

打开模式简述文件不存在 文件指定位置 是否清空原有内容读取位置 写入位置是否会覆盖
r只读打开失败开头任意位置读取不可写入-
w只写新建 开头不可读取任意位置写入 写入时会覆盖原有位置内容
a新建结尾不可读取只能尾部写入-
r+读写打开失败开头任意位置读取 任意位置写入写入时会覆盖原有位置内容
w+新建开头任意位置读取任意位置写入 写入时会覆盖原有位置内容
a+新建 结尾任意位置读取 只能尾部写入-

移动指针(seek方法)

seek方法移动变量
    seek第一个参数是偏移量:>0,代表向右移动,<0,代表向左移动
    seek第二个参数是:
            0:移动指针到文件开头
            1:不移动指针
            2:移动指针到末尾

with

with语句提供了一种非常方便的处理方式,可以很好的避免以下问题:

  • 可能忘记关闭文件句柄;
  • 文件读取数据发生异常,没有进行任何处理
# python3写法:
with open('/tmp/passwd') as f1 , open('/tmp/passwdBackUp','w+') as f2:
    f2.write(f1.read()) # 将f1读取的内容写入f2中
    # 这里要注意,在写入内容后,指针当前位置在文件的尾部,如果直接读取文件,无法读取到
    # 那么,我们要先将指针调整到首部
    f2.seek(0)
    print(f2.read())
 
# python2写法:
with open('/tmp/passwd') as f1:
    content = f1.read()
with open('/tmp/passwdBackUp','w+'):
    f2.write(content)

 文件OS

os.name                 # 当前系统,结果表示posix -> linux  |  nt    -> windows
 
os.uname                # 显示sysname[操作系统]、nodename[主机名]、release[内核版本]、version[版本]、machine[机器架构]信息
os.uname().sysname      # 显示操作系统
 
os.environ              # 系统环境变量
os.environ.get('PATH')  # 获取key为PATH的value值
 
os.walk()               # 遍历指定目录下的所有内容
 
# 1. 判断是否为绝对路径[是否以‘/’开头],且只判断路径,不会判断文件是否存在
print(os.path.isabs('/tmp/student'))
print(os.path.isabs('student'))
 
# 2. 生成绝对路径
print(os.path.abspath('timg.jpg')) # 根据当前目录生成
print(os.path.join('/home/dsd','timg.jpg')) # 拼接绝对路径
print(os.path.join(os.path.abspath('.'),'timg.jpg')) # 用.表示当前目录
 
# 3. 获取目录名或文件名
filename = '/root/PycharmProjects/westos/day07/timg.jpg'
print(os.path.basename(filename))   # 获取filename中的文件名
print(os.path.dirname(filename))    # 获取filename中的目录名
 
# 4. 如何删除和创建目录
os.mkdir('xyz')            # 创建目录
os.makedirs('img/files')   # 创建递归目录
os.rmdir('xyz')            # 删除目录,只能删除空目录
 
# 5.创建文件
os.mknod('note.txt')       # 创建文件
os.remove('note.txt')      # 删除文件
 
# 6. 重命名
os.rename('data.txt','data1.txt') # 将data.txt名称修改为data1.txt
 
# 7. 判断文件或目录是否存在
print(os.path.exists('note.txt'))
 
# 8. 分离文件名和后缀名
print(os.path.splitext('note.txt'))
 
# 9. 分离目录名和文件名
print(os.path.split('/tmp/dsd/text.jpg'))
 
# 10. 获取文件时间
time1 = os.path.getctime('/etc/shadow')
print(time1) 

时间格式的转换

# 1. 把元组时间改为时间戳
tuple_time = time.localtime()
print(tuple_time)
print(time.mktime(tuple_time))
 
# 2. 元组时间转换为字符串时间
print(time.strftime('%m-%d',tuple_time))
print(time.strftime('%Y-%m-%d',tuple_time))
print(time.strftime('%T',tuple_time))
print(time.strftime('%F',tuple_time))
 
# 3. 时间戳时间转换为字符串时间
pwd_time = os.path.getctime('/etc/passwd')
print('pwd_time',pwd_time)
print(time.ctime(pwd_time))
 
# 4. 时间戳转换为元组时间
print(time.localtime(pwd_time))

文件读写练习

f = open('/tmp/passwd')
 
print(f.readable())
print(f.writable())

此时文件状态是可读但是不可写,在读取文件时,加'r+'

f = open('/tmp/passwd','r+')

在文件里面写内容

f.write('hello world')

指针练习

打开文件,默认指针在首位,在执行完写操作后,指针就处于写入内容后,第一次f.read()读取是从写入的内容后面开始,通过f.tell()告知指针当前位置;再执行一次读操作,结果为空,因为它是从最后面开始读,其后面已经没有字符,因此为空。 

# 将timg.jpg文件复制
# 非文本文件的读取
f1 = open('timg.jpg',mode = 'rb')
content = f1.read()
f1.close()
 
f2 = open('test.jpg',mode='wb')
f2.write(content)
f2.close()

 创建文件data.text,文件共100000行,每行存放一个1~100之间的整数

import random
with open('data.txt','w+') as f:
    for i in range(100000):
        f.write(str(random.randint(1,100)) + '\n')
        # 转换成字符串原因是字符串支持连接
    f.seek(0)
    print(f.read())

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

import random
def create_ipFile(filename):
    ip = ['192.168.43.' + str(i) for i in range(1,255)]
    with open(filename,'w+') as f:
        for i in range(1500):
            f.write(random.sample(ip,1)[0] + '\n')
# create_ipFile('ips.txt')
def sorted_file(filename,count=10):
    ips_dict = dict()
    with open(filename) as f:
        for ip in f:
            ip = ip.strip()  # 清除空格带来的影响
            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_file('ips.txt'))

生成100个MAC地址并写入文件中,MAC地址前6位(16进制)为01-AF-3B
01-AF-3B
01-AF-3B-xx
01-AF-3B-xx-xx
01-AF-3B-xx-xx-xx 

import random
import string
def create_mac():
    MAC = '01-AF-3B'
    hex_num = string.hexdigits
    for i in range(3):
        n = random.sample(hex_num,2)
        sn = '-' + ''.join(n).upper()
        MAC += sn
    return MAC
def main():
    with open('mac.txt','w+') as f:
        for i in range(100):
            mac = create_mac()
            print(mac)
            f.write(mac + '\n')
main()

1. 在当前目录新建目录img,里面包含100个文件,100个文件名各不相同(X4G5.png)
2. 将当前img目录所有以.png结尾的后缀名改为:.jpg 

import random
import string
import os
from os.path import splitext
# 生成随机码
def create_random(len=4,li=['.bmp','.jpeg','.png','.gif']):
# string.digits + string.ascii_letters:随机码由数字和大小写字母组成
    random_list = [random.choice(string.digits + string.ascii_letters) for i in range(len)]
    return ''.join(random_list) + random.choice(li)
# 创建img目录,生成100个文件
def create_dir_file(dirname = 'img'):
    if not os.path.exists(dirname):
        os.mkdir(dirname)
    else:
        print(dirname + 'is exists')
        exit()
    for i in range(100):
        os.mknod(dirname + '/' + create_random())
# 寻找img目录下后缀名为.png文件,将后缀名修改为.jpg
def mod_suffix(dirname = 'img',old_suffix='.png',new_suffix='.jpg'):
    # .png后缀名文件
    aimsFiles = [filename for filename in os.listdir(dirname) if filename.endswith(old_suffix)]
    # filter(函数,序列)  lambda 形参:返回值
    # aimsFiles = filter(lambda filename:filename.endswith(old_suffix),os.listdir(dirname))
    # 分离目标文件名和后缀名
    basename = [os.path.splitext(filename)[0] for filename in aimsFiles]
    # 更改文件后缀名
    for i in basename:
        old_name = os.path.join(dirname,i + old_suffix)
        new_name = os.path.join(dirname,i + new_suffix)
        os.rename(old_name,new_name)
    print('%s is renamed,The suffix is now %s' %(old_name,new_name))
create_dir_file()
mod_suffix()

知识点应用

需求:
    1. 获取当前主机信息, 包含操作系统名, 主机名,
    内核版本, 硬件架构等
    2. 获取开机时间和开机时长;
    3. 获取当前登陆用户

print('主机信息'.center(50,'*'))
info = os.uname()
print(
    """
    操作系统: %s
    主机名称: %s
    内核版本: %s
    硬件架构: %s
    """%(info.sysname,info.nodename,info.release,info.machine)
)
print('开机信息'.center(50,'*'))
boot_time = psutil.boot_time()
boot_time_obj = datetime.fromtimestamp(boot_time)
# print(type(boot_time_obj))
now_time = datetime.now()
time1 = now_time - boot_time_obj
 
print('开机时间',boot_time_obj)
print('当前时间',str(now_time).split('.')[0])
print('开机时长',str(time1).split('.')[0])
print('当前登陆用户'.center(50,'*'))
login_user = psutil.users()
print(login_user[0].name)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值