12. python从入门到精通——文件及目录操作

news2024/11/15 13:58:28

目录

基本文件操作

创建和打开文件:open()函数

关闭文件:可以不关闭文件因为有垃圾回收功能

打开文件时使用with语句:不需要自己关闭文件,可以自己关闭

写入文件内容

file.write方法

file.writelines方法:可以向文件中写入字符串列表,但没有换行符和分隔符

读取文件有三种情况

读取指定字符

读取一行:如果文件很大一次读取全部内容到内存容易造成内存不足,通常会采用逐行读取

读取全部行

目录操作

os和os.path模块

os

os.path模块是os的子模块

路径

判断文件或目录是否存在

创建目录

创建单级目录

创建多级目录

删除目录

删除空目录

删除不为空目录,需要pathon内置的标准模块shutil的rmtree函数实现

遍历目录:把指定目录下的全部目录和文件都访问一遍

高级文件操作

删除文件

重命名文件或目录

获取文件基本信息


基本文件操作

创建和打开文件:open()函数

    语法:

      file = open(filename[,mode[,buffering]],[encoding])  

                #file:返回值是一个文件对象

                #mode:指定打开模式,默认为 r ,有三种基本模式可以与+号组合

                    r:只读模式

                    w:只写模式,先清空原文件内容在写入新的内容,如果文件不存在则创建文件

                    a:追加模式,如果文件不存在则创建文件

                    b:二进制模式,可以用这种方式打开音视频文件生产一个对象,我们可以用第三方模块对它进行处理

                #buffering:用来指定读写文件的缓冲模式

                    0:不缓存

                    1:缓存

                    大于1:缓冲区大小

    示例

file = open('test.txt','w',encoding = "utf-8")  #只读方式打开文件如果文件不存在则创建


file = open('test.txt','r',encoding = "utf-8")
print(file.read())  #读取文件

file = open('pic.png','rb')  #打开图片
print(file.read())

关闭文件:可以不关闭文件因为有垃圾回收功能

    只有关闭文件其他程序才能同一个文件进行写操作

    对于close方法再关闭文件前他会先刷新缓冲区中还没有写入的信息,从而把没有写入的内容输出到文件中

    语法:

        file.close() #关闭文件

        file.closed  #判断文件是否被关闭,返回bool值

    示例

file = open('test.txt','r',encoding = "utf-8")
print(file.read())
print(file.closed)
file.close()
print(file.closed)

打开文件时使用with语句:不需要自己关闭文件,可以自己关闭

    使用with语句执行open函数打开文件语法:

        with expression as target:

            with-body    

                # expression:指定要打开文件的open函数

                #target:用as关键字指定一个变量来保存expression表达式的结果

                #with-body:用来指定一些with语句之后的操作,例如expression中执行的是open函数就可以对打开的这个文件进行操作,如果不想操作可以用pass来代替     

    示例  

with open('test.txt','r',encoding = "utf-8") as file:
    print(file.read())
print(file.closed)

写入文件内容

file.write方法

    语法:

        file.write(string)

    注意:写入文件后必须要关闭文件或不关闭文件但执行file.flush方法把缓冲区内容输出到文件中才能保存内容

    示例

file = open('test.txt','a',encoding = "utf-8")
file.write("\n学习python")  #换行追加内容
file.close()  #输出缓冲区

file.writelines方法:可以向文件中写入字符串列表,但没有换行符和分隔符

    语法:

        file.writelines(ListName)

    示例

import random
list = [str(i) + str(random.randint(10,100)) for i in range(10)] #生成字符串列表
list = [i + '\n' for i in list] #用列表推导式生成换行符
file = open('test.txt','w')
file.writelines(list)  #把字符串列表写入文件
file.close()

读取文件有三种情况

读取指定字符

        语法:

            file.read([size])

                #size:可选参数,指定要读取的字符个数,用read读取时每个汉字也占一个字符,默认读取全部字符

            注意:这个方法要求打开文件模式为 r 或者 r+

补充:

        file.seek([size]):设置指针,因为file.read方法默认从头开始读取,可以通过file.seek设置起始位置

            注意:file.seek的字符个数是根据编码字符个数计算例如utf-8的编码汉字为两个字符

        示例

#写入文件
file = open('test.txt','w')
file.write("\n学习python")
file.close()
  
with open('test.txt','r',encoding = "utf-8") as file:
    file.seek(4)  #定义指针
    string = file.read(2)
    print(string)

读取一行:如果文件很大一次读取全部内容到内存容易造成内存不足,通常会采用逐行读取

        语法:

            file.readline(size)    #打开文件方式必须为 r 或 r+

                #size:从行中读取的字节数

        示例

import random
list = [str(i) + str(random.randint(10,100)) for i in range(10)]
list = [i + '\n' for i in list]
file = open('test.txt','w')
file.writelines(list)
file.close()
with open('test.txt','r') as file:
    while True:
        line = file.readline()
        if line =="":
            break
        print(line)
print("="*20)
with open('test.txt','r') as file:   
    for i in range(5):  #读取5行
        print(file.readline(2))

读取全部行

        语法:

            file.readlines()  #打开文件方式必须为 r 或 r+,返回以每行为元素的字符串列表

        示例

import random
list = [str(i) + str(random.randint(10,100)) for i in range(10)]
list = [i + '\n' for i in list]
file = open('test.txt','w')
file.writelines(list)
file.close()
with open('test.txt','r') as file:
    print(file.readlines())

目录操作

python中没有提供直接提供操作目录的函数或者对象,需要使用内置的OS和OS.path模块实现

os模块:是python内置的与操作系统功能和文件系统相关的模块,该模块中语句的执行结果通常与操作系统有关,在不同的操作系统运行可能得到不同的结果。

os和os.path模块

os

os.path模块是os的子模块

路径

       获取当前的工作路径

            语法:

                os.getcwd() 

        获取文件的绝对路径    

            语法    

                os.path.abspath(path) 

                    #path:文件的相对路径

            示例

os.path.abspath('test.txt')

        拼接路径,可以拼接成相对路径和绝对路径

            语法

                os.path.join(path1[,path2,....]) 

            注意:在拼接路径时python不会检查路径是否真实存在的

            示例:

print(os.path.join(r'/home/python','test.txt'))

判断文件或目录是否存在

        语法:

            os.path.exists(path) #返回为bool值

创建目录

创建单级目录

        语法:

            os.mkdir(path,mode=0777)

                #mode:linux系统目录权限,为八进制数字,默认为0777

        注意:如果要创建多级目录和目录已存在都会抛出异常

        示例:

if not os.path.exists('pak'):
    os.mkdir('pak',mode=755)
else:    
    print(os.path.abspath('pak'))

创建多级目录

        语法:

            os.makedirs(name,mode=777)

删除目录

删除空目录

        语法:

            os.rmdir(path)  #目录不存在或者不为空会抛出异常

        示例

if os.path.exists('pak'):
    os.rmdir('pak')

删除不为空目录,需要pathon内置的标准模块shutil的rmtree函数实现

         语法:

             shutil.rmtree(path)

import shutil
if not os.path.exists('pak/test'):
    os.makedirs('pak/test')  #创建多级目录
print(os.path.abspath('pak/test'))  #输出路径
shutil.rmtree('pak/test')
os.path.exists('pak/test')  #删除多级目录

遍历目录:把指定目录下的全部目录和文件都访问一遍

        语法:

            os.walk(top[,topdown][,onerror][,follwlinks])

                #这个函数返回值为元组生成器对象每有一个子目录就会多生成一个元组对象,在这个对象中会生成包含三个元素的元组:

                    (dirpath,dirnames,filebames)  

                        #dirpath:当前遍历的路径,是一个字符串

                        #dirnames:当前路径下包含的子目录,是一个列表

                        filebames:当前路径下包含的文件,是一个列表

                #top:指定要变量内容的根目录,当前目录可表示为'./'

                #topdown:指定遍历的顺序:

                    True:默认值为True,表示自上而下遍历先遍历根目录再遍历子目录

                    Flase:表示自下而上遍历

                #onerror:用来指定错误处理方式,默认为忽略    

                #follwlinks:

                        True:表示指定在支持的系统上访问由软连接指向的目录

                        False:不支持   

        示例        

import os
path = os.walk(r'./')
for root,dirs,files in path:
    for i in dirs:
        print(os.path.join(root,i)) #输出遍历的目录
    for i in files:
        print(os.path.join(root,i)) #输出遍历的文件

高级文件操作

删除文件

语法:

    os.remove(path)  #删除不存在的文件时会抛出异常

示例

with open('pak/test.txt','w') as file: #创建文件
    pass
print(os.path.exists('pak/test.txt'))
os.remove('pak/test.txt')  #删除文件
print(os.path.exists('pak/test.txt'))

重命名文件或目录

语法:

    os.rename(src,dst)

示例:

if os.path.exists('pak/test.txt'):
    os.rename('pak/test.txt','pak/test1.txt')
if os.path.exists('pak'):              
    os.rename('pak','pak1')

获取文件基本信息

语法:

    os.stat() 

        #返回值是一个对象,可以通过以下对象方法获取文件相关属性:

            st_ctime:文件创建时间,以秒为单位
            st_mtime:文件修改时间,以秒为单位
            st_atime:文件最后一次访问时间,以秒为单位
            st_size:文件大小,以字节单位显示
            st_mode:权限
            st_ino:文件索引号,linux中是inode编号

示例

fileinfo = os.stat('pak1/test1.txt')
print("\n",fileinfo.st_ino,"\n",fileinfo.st_ctime,"\n",fileinfo.st_size)

示例:查询图片文件的基本属性并格式化成易读的时间和文件大小进行输出

import os   # 导入os模块

def formatTime(longtime):
   '''格式化日期时间的函数
      longtime:要格式化的时间
   '''
   import time  # 导入时间模块
   return time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(longtime))
def formatByte(number):
   '''格式化日期时间的函数
      number:要格式化的字节数
   '''    
   for (scale,label) in [(1024*1024*1024,"GB"),(1024*1024,"MB"),(1024,"KB")]:
       if number>= scale:   # 如果文件大小大于等于1KB
           return "%.2f %s" %(number*1.0/scale,label)
       elif number == 1: # 如果文件大小为1字节
           return "1 字节"
       else:   # 处理小于1KB的情况
           byte = "%.2f" % (number or 0) 
   return (byte[:-3] if byte.endswith('.00') else byte)+" 字节"  # 去掉结尾的.00,并且加上单位“字节”


if __name__ == '__main__':
   fileinfo = os.stat("/var/log/secure-20230618") # 获取文件的基本信息
   print("文件完整路径:", os.path.abspath("mr.png")) # 获取文件的完整数路径
   # 输出文件的基本信息
   print("索引号:",fileinfo.st_ino)
   print("设备名:",fileinfo.st_dev)
   print("文件大小:",formatByte(fileinfo.st_size))
   print("最后一次访问时间:",formatTime(fileinfo.st_atime))
   print("最后一次修改时间:",formatTime(fileinfo.st_mtime))
   print("最后一次状态变化时间:",formatTime(fileinfo.st_ctime))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis插件开发——解析和记录输出完整的SQL语句

实现功能 自定义MyBatis插件,该插件实现当MyBatis执行SQL发生异常时输出错误原因,SQL参数以及完整的SQL语句。在日常的开发中我们可以通过mybatis配置设置是否输出SQL,但是对于正常运行的SQL全部输出出来日志量过大,所以这里实现…

使用VScode + clangd 阅读 c/c++ 源码环境搭建

使用Vscode clangd 阅读c/c源码 一、需求 在嵌入式软件开发的工作中,我们常常需要分析C/C代码,比如linux kernel 的代码,而公司的代码一般都会存放在服务器中,服务器一般是linux,且无法联网,我们只能通过…

C++智能指针-保姆级讲解带你一文搞懂智能指针(附核心代码实现+讲解)

C智能指针 1.引言1.1 为什么会出现智能指针1.2内存泄漏1.2.1 什么是内存泄漏,内存泄漏的危害1.2.2 内存泄漏分类1.2.3如何检测内存泄漏1.2.4如何避免内存泄漏 2. 智能指针的使用及原理3.常见智能指针3.1std::auto_ptr3.2std::unique_ptr3.3std::share_ptr 1.引言 1…

【雕爷学编程】Arduino动手做(116)---五向导航按键模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

Axure教程—环形进度条

本文将教大家如何用AXURE制作环形进度条 一、效果 预览地址:https://mmfwgo.axshare.com 二、功能 (1)、点击“开始”按钮,环形进度开始执行,“开始”按钮转换为“暂停”按钮 (2)点击“重置”按…

delphi的ARM架构支持与System.Win.WinRT库

delphi的ARM架构支持与System.Win.WinRT库 目录 delphi的ARM架构支持与System.Win.WinRT库 一、WinRT 二、delphi的System.Win.WinRT库 2.1、支持ARM芯片指令 2.2、基于WinRT技术的特点 2.3、所以使用默认库而未经转化的服务端应用并不支持ARM架构服务器 2.4、对默认库…

自学网安遇到问题了该怎么解决

自学网络安全很容易学着学着就迷茫了,找到源头问题,解决它就可以了,所以首先咱们聊聊,学习网络安全方向通常会有哪些问题,看到后面有惊喜哦 1、打基础时间太长 学基础花费很长时间,光语言都有几门&#xf…

计算机程序设计的艺术--第一卷--第一章(1)

1 BASIC CONCEPT 1.1 algorithm algorithm 是所有计算机编程的本质,我们要仔仔细细的追溯一下这个概念是怎么来的。 algorithm 这个词,非常有意思,乍一看,好像是要写 logarithm,写错了,写成了 algorithm…

QTYX量化系统实战案例分享|均线多头排列惯性突破前高-202306第五弹

前言 “实战案例分享系列”是和大家分享一些股票量化分析工具QTYX在实战中的应用案例(包括失败的案例),这样能够帮助大家更好地去理解QTYX中的功能设计,也能更好地帮助大家搭建出属于自己的量化交易系统。 关于QTYX的使用攻略可以…

Java Spark 操作 Apache Kudu

一、Apache Kudu Apache Kudu是一种列式分布式存储引擎,它的设计目标是支持快速分析和高吞吐量的数据访问,同时也能够支持低延迟、实时查询和更新操作。它被称为Hadoop生态系统的新一代存储层,能够与Apache Spark、Apache Impala、Apache Hiv…

Python3 字典与集合 | 菜鸟教程(七)

目录 一、Python3 字典 (一)字典是另一种可变容器模型,且可存储任意类型对象。 (二)字典的每个键值 key>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 &am…

西南交通大学智能监测 培训课程练习5

2023.06.17培训 linux的简单实用 打包、部署后端jar服务 目录 一、连接远程服务器 二、maven项目打包 2.1添加build依赖 2.2使用maven打包 三、Linux基础操作 3.1利用Xftp上传文件 3.1.1返回上一层目录 3.1.2查看文件 3.1.3进入文件 3.1.4创建文件夹 3.1.5上传文件 …

安装Apache mysql php

一.Apache网站服务 Apache起源 源于 APatchy Server,著名的开源Web服务软件 1995年时,发布Apache服务程序的1.0版本 由Apache软件基金会 (ASF) 负责维护 最新的名称为“Apache HTTP Server 安装Apache----下面两个插件是httpd2.4以后的版…

SpringBoot整合activiti7实现简单的员工请假流程

Activiti 是一个开源架构的工作流引擎&#xff0c;基于bpmn2.0 标准进行流程定义。其前身是JBPM&#xff0c;Activiti 通过嵌入到业务系统开发中进行使用。 整合springboot 引入相关依赖 <!-- 引入Activiti7 --><dependency><groupId>org.activiti</gro…

什么是2.5G和5G多千兆端口?

概要 在当前数字化时代&#xff0c;对于高速数据传输和网络连接的需求不断增长。为了满足这种需求&#xff0c;网络技术也在不断发展和进步。2.5G和5G多千兆端口是一种新型的网络连接技术&#xff0c;提供了比传统千兆以太网更高的传输速率和带宽。本文将详细介绍 的定义、工作…

[元带你学: eMMC协议详解 15] 写保护(Write Protect)详解

依JEDEC eMMC 5.1及经验辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 1300字&#xff0c; 主要讲述写保护的用法&#xff0c; 写保护的类型。 Write Protect Management 为了允许主机保护数据不被擦除或覆盖写入&…

vue-server-renderer实现服务端渲染

vue-server-renderer实现服务端渲染 简单认识vue-server-renderer&#xff1a; 是 Vue.js 官方提供的一个库&#xff0c;用于将 Vue 组件渲染成 HTML 字符串或流&#xff0c;通常用于服务端渲染。 具体的咱们vue-server-renderer如何实现 1、预编译组件&#xff1a;根据 Vue …

云安全技术(一)之什么是云计算

对于在云环境中工作的安全专家而言&#xff0c;从传统数据中心模型获得的许多知识和最佳实践仍然适用于云计算环境&#xff0c;但安全专家对云计算概念、不同类型的云模型和云服务的深入理解对于成功实施和监督(Overseeing)安全策略和合规性至关重要。 什么是云计算 1.1 云计…

扫码枪(扫描枪)扫码在vue中的使用教学

1.扫描枪使用原理浅析。 扫描枪的使用原理其实很简单&#xff1a;就是把光信号转换成电信号&#xff0c;再将电信号通过模拟数字转换器转化为数字信号传输到计算机中处理。其实可以简单理解为&#xff1a;二维码/条形码 转换成 字符串。 2.扫描枪功能开发前准备。 正所谓“工…

关于【C语言】中scanf与getchar的用法和常见错误详解

写这篇博客的起因是最近博主自己学习中总是遇到类似的错误&#xff0c;并曾百思不得其解。 今天分享出来是希望帮助大家在写代码时避免这些错误。话不多说&#xff0c;我们直接开始吧&#xff01; 君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 输入函数scanf与getcha…