在Python中管理文件,os模块,psutil模块的使用

2024-03-29 03:58

本文主要是介绍在Python中管理文件,os模块,psutil模块的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在python中读取文件

操作文件的三个步骤:
打开 —> 操作 —> 关闭

f = open('/etc/passwd')open 调用文件
print(f.read())				查看文件内容
print(f.readable())         文件是否可读
print(f.writable())			文件是否可写	
f.close()					关闭

在这里插入图片描述
可以看出文件可读,不可写,并打印出了文件内容。

f.write('hello')    #写入操作

在这里插入图片描述
看出是不可写的,并且报错not writable 不可写。

我们改变一下参数; 在执行
在这里插入图片描述
就变成可写了,并且可以看见已经在文件中加上了hello字符,并且在正式文件中,比打印出来的多了一次:
在这里插入图片描述
这个 r+ 是文件的读取模式,共有六种模式,每种模式有不同的效果。

r:(默认)
   -只能读,不能写
   -读取的文件不存在,会报错
   FileNotFoundError: [Errno 2] No such file or directory:
r+:
   -可以执行读写操作
   -文件不存在,报错
   -默认情况下,从文件指针所在位置开始写入

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

a:
  -write only
  -不会清空文件内容
  -文件不存在,不报错,创建新文件

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

在这里插入图片描述

f = open('/mnt/passwd','rb')       rb 和 r+ 的读取方式差不多,rb 内容打印到一行
print(f.read())

在这里插入图片描述

f = open('/mnt/passwd','rb')
# print(f.read())print(f.readline())               readline只打印一行内容

在这里插入图片描述

pringt(f.readlines)       打印一个列表

在这里插入图片描述

print(f.read(4))      读四个字符

在这里插入图片描述


指针的概念

复制 /etc/passwd 到 /mnt/passwd,进行操作

f = open('/mnt/passwd','r+')
f.write('python')
print(f.read())

文件的第一行会出现这个内容:
在这里插入图片描述
我们没有看见python,从python后一位开始读的
在这里插入图片描述
但在真实的文件中却看见了python字符。
这就是文件指针的作用,那我们如何查看文件指针所处的位置?
在这里插入图片描述
f.tell 可以查看指针所处的文件位置,是2574;
在这里插入图片描述
文件只有2574个字符,所以指针处于最后。

f = open('/mnt/passwd','r+')
f.write('python')
print(f.read())
print(f.tell())
print(f.read())          # 打印两次
print(f.tell())

在这里插入图片描述
于是我们就可以截解释为,在写 ‘python’ 后指针从开头写到python后面,再读取到文件的最后,指针就走到了最后,第二次读取时,从指针后面读取内容,后面没有内容,所以为空。

操纵指针

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

f = open('/mnt/passwd','rb')
print(f.tell())

在这里插入图片描述
打开文件时,指针默认在0位置。

print(f.tell())
print(f.read(3))
print(f.tell())

在这里插入图片描述
经过一次读取,指针位置到了第三位。
我们可以通过 .seek 的方法去移动指针。

print(f.tell())
print(f.read(3))
print(f.tell())
f.seek(-1,2)
print(f.tell())

-1 表示向左移动一位,2表示移动到末尾,所以结合起来就是 移动到末尾在向左移动一位,
源文件一共2574位,所以移动到2573位置
在这里插入图片描述

f.seek(0)              0表示移动到开始位置,不需要第二个参数。
print(f.tell)

在这里插入图片描述

读取非纯文本文件

读取纯文本文件时,我们有以下几个参数;
“”"
r r+ w w+ a a+
rb rb+ wb wb+ ab ab+
“”"
当我们获取一个图片到当前目录;
在这里插入图片描述
我们尝试读取他一个图片时:
在这里插入图片描述
读取到的是这样的信息,这显然不能以这种方式读取图片。
我们通过写的方式复制这个图片:
在这里插入图片描述
左边出现了这个新的图片文件。双击打开:
在这里插入图片描述
两张图片相同。

with

由于每次读取文件都要写 .close 去关闭这个文件,有点麻烦,所以我们可以用 with 的方式打开:
with的方式会在读取完后会自动关闭文件,不用我们再去写代码了。

with open('/mnt/passwd') as f:with将其命名为fprint(f.read())

###打开两个文件:

with open('/mnt/passwd') as f1,\open('/mnt/passwd1','w+') as f2:         将f1的内容写到f2中。f2.write(f1.read())f2.seek(0)print(f2.read())

这种方法在python3中可用。
在python2 中不能将两个连在一起:

with open('/mnt/passwd') as f1:content = f1.read()with open('/mnt/passwd1','w+') as f2:f2.write(content)

练习:
“”"
创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数
“”"

import random
f = open('data.txt','w+')
for i in range(100000):f.write(str(random.randint(1,100)) + '\n')f.seek(0)
print(f.read())
f.close()

在这里插入图片描述

os操作系统模块

和运维息息相关的一个模块:

1 查询系统类型:

import os#os   posix -> linux   nt -> windows
print(os.name)

在这里插入图片描述
2 查询系统详细信息

#2
info = os.uname()
print(info)
print(info.sysname)           系统类型
print(info.nodename)           主机名print(os.environ)              环境变量

在这里插入图片描述
在这里插入图片描述
3, 判断是否为绝对路径:

#1
print(os.path.isabs('/mnt/python'))
print(os.path.isabs('python'))

在这里插入图片描述
他只能判断是否是绝对路径,不能判断文件是否存在。就像上面 /mnt/python 是不存在的

4 生成绝对路径;

print(os.path.abspath('hello.jpg'))                生成文件的绝对路径
print(os.path.join('/home/thermal','hello.jpg'))		拼接绝对路径
print(os.path.join(os.path.abspath('.'),'hello.jpg'))	与当前目录绝对路径拼接

在这里插入图片描述

5 获取文件名和目录名:

filename = '/root/PycharmProjects/2020423/day09/hello.jpg'
print(os.path.basename(filename))
print(os.path.dirname(filename))

在这里插入图片描述
6 删除和创建目录

os.mkdir('abc')
os.makedirs('img/file')    创建递归目录

在这里插入图片描述

os.rmdir('abc')           只能删除空目录
os.rmdir('img')          img底下有文件,所以不会删除

在这里插入图片描述
7 删除创建文件

os.mknod('file.txt')
os.remove('file.txt')

8 重命名

#6rename
os.rename('data.txt','data1.txt')

在这里插入图片描述
9 判断文件或者目录是否存在
在这里插入图片描述
10 分离文件名和后缀名
在这里插入图片描述
可用于批量查找。

11 分离文件名和目录名
在这里插入图片描述
12 time.time
可以计算时间间隔,获取 atime , ctime , mtime

import os
import timetime1 = os.path.getctime('/etc/shadow')          unix的计算时间方式
print(time1)
tuple_time = time.localtime(time1)				元组时间,以key,value值的方式显示
print(tuple_time)

在这里插入图片描述

year = tuple_time.tm_year
month = tuple_time.tm_mon
day = tuple_time.tm_mdaywith open('data1.txt','a') as f:     #将时间写入到文件f.write('%d %d %d' %(year,month,day))f.write('\n')

在这里插入图片描述
13 不同格式时间之间的转换

import time
import os#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))

在这里插入图片描述

对目录的操作

import os
from os.path import joinfor root,dir,files in os.walk('/var/log'):              .walk表示遍历这个目录下的所有内容print(root)       打印目录路径print(dir)		  打印目录名称print(files)	  打印文件名for name in files:print(join(root,name))           连接起来

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
练习:

“”"
京东二面笔试题

  1. 生成一个大文件ips.txt,要求1200行, 每行随机为172.25.254.0/24段 的ip;
  2. 读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
import random
#生成文件
def create_ip_file(filename):ip = ['172.25.254.' + str(i) for i in range(1,255)]with open(filename,'a+') as f:for i in range(1200):f.write(random.sample(ip,1)[0] + '\n')#random.smple(ip,1) 打印出来时一个列表。没有拼接功能,所以取它的第0个元素。
create_ip_file('aps.txt')#排序
def sorted_ip_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] += 1else:ips_dict[ip] = 1socted_ip = sorted(ips_dict.items(), key=lambda x:x[1],reverse=True)[:count]   #x[1]是把x的value值做返回值     再倒序     再切割前十return socted_ip
print(sorted_ip_file('ips.txt')) 

在这里插入图片描述
练习四;

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

import random
import stringdef create_mac():MAC = '01-AF-3B'hex_num = string.hexdigits       #是所有16进制的字符       for i in range(3):n = random.sample(hex_num,2)     #从16进制字符取两个sn = '-' + ''.join(n).upper()		#取大写MAC += sn							#连接return MACdef main():with open('mac.txt','w') as f:     #创建文件for i in range(100):mac = create_mac()print(mac)f.write(mac + '\n')			#写进文件main()

执行:
在这里插入图片描述

综合练习

psutil模块

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

import os
import psutil
from datetime import datetimeprint('主机信息'.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)

在这里插入图片描述

这篇关于在Python中管理文件,os模块,psutil模块的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/857537

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没