Python os模块文件操作(一)_os.o_rdonly-程序员宅基地

技术标签: Python os模块文件操作  os创建文件操作  os创建文件夹操作  Python/PYPI  os读取文件内容和删除文件  os.open()的参数说明  

Python os模块文件操作(一)

一、文件描述符

在使用代码对文件进行操作时,为了指定操作的文件,避免不了要使用文件描述符,所以我们先介绍什么是文件描述符。

操作系统为了高效管理已经被打开的文件,会给每个打开的文件创建索引,这个索引就叫做文件描述符。

文件描述符是非负整数(索引),用于指代被打开的文件(关闭状态的文件没有)。所有执行i/o操作的系统调用都是通过文件描述符完成的,进程通过文件描述符来访问文件。

在程序(如python)刚启动的时候,默认有3个文件描述符:0(标准输入),1(标准输出),2(标准错误),系统默认使用了 0~2的文件描述符,之后当我们进行 open,create 等操作的时候,文件描述符从3开始,依次添加。

当我们新建create或者打开open一个文件,得到的文件描述符fd是从3开始的,继续新建或打开一个文件,文件描述符继续自增,当释放close之后,文件描述符自减,如果再继续新建,则填补之前减掉的空缺。

既然文件描述符是操作系统(进程)层面的索引,那需要使用文件描述符时怎么获取呢?

在os模块新建或打开一个文件时,会将文件描述符返回给我们。同时,Python提供了获取文件描述符的方法fileno(),使用当前文件f的fileno()方法,可以获取文件对象f的文件描述符,使用起来很方便。在接下来的文件操作中会使用到。

二、os创建文件夹操作

# coding=utf-8
import os


try:
    # 在当前目录下创建一个文件夹
    os.mkdir('test_folder')
except os.error:
    pass
# 获取当前所在目录
print(os.getcwd())
try:
    # 重命名文件夹
    os.rename('test_folder', 'os_folder')
except os.error:
    pass
# 获取目录中的文件
print(os.listdir('os_folder'))

运行结果:

/home/python/Desktop/python_demo/os_test
[]

os.mkdir(folder_name)在当前目录下创建一个指定名字的空文件夹,运行代码后会看到当前目录下多出来一个文件夹。在使用mkdir()时最好try一下,如果同名文件夹存在的时候,创建失败,程序会报错。

os.getcwd()方法会返回当前所在的绝对路径。

os.rename(old, new)方法将指定的文件夹(或文件)名字从old改成new,修改后可以看到文件夹的名字变化了。使用时最好try一下,如果已经有文件夹的名字叫new了,修改失败,程序会报错。

os.listdir(folder_name)返回指定文件夹中有哪些文件夹和文件,不包含隐藏文件,返回结果是一个列表。当然,在我们刚创建的文件夹里,现在还什么也没有,所以返回的是空列表。

三、os创建文件操作

# 改变目录
os.chdir('os_folder')
print(os.getcwd())
# 打开一个文件,返回的是文件的文件描述符
fd = os.open('aaa.txt', os.O_CREAT|os.O_WRONLY)
# 在文件中写入内容
print(fd)
os.write(fd, 'aaaaa'.encode('utf-8'))
# 关闭文件
os.close(fd)
with open('aaa.txt', 'r') as f:
    # 获取当前文件的文件描述符
    print(f.fileno())

运行结果:

/home/python/Desktop/python_demo/os_test/os_folder
3
3

运行上面的代码后,在os_folder目录下创建了一个aaa.txt的文件,打开aaa.txt文件,里面的内容是aaaaa。

os.chdir(folder_name)是改变当前所在的目录位置,进入到其他的文件夹中。类似于命令行中的cd。使用os.chdir()后,再使用os.getcwd()查看目录,看到已经进入指定的目录中了。

os.open(file, flags[, mode])可以创建一个不存在的文件或者打开一个已经存在的文件,返回值是文件的文件描述符。

如果打开的文件不存在,则需要给flags参数传值os.O_CREAT表示创建,否则代码会报错。如果是打开一个已经存在的文件,flags传入了os.O_CREAT不会影响打开。

os.open()返回文件描述符,给其他文件操作方法使用,如os.write(),os模块中很多文件的操作都是依靠文件描述符来定位文件。

os.write(fd, str)是在文件fd中写入内容,fd是文件的文件描述符,str是写入文件中的内容。

os.close(fd)是将文件fd关闭,如果不使用close()方法,则这个文件一直处于打开状态。

在前面我们说了,可以使用fileno()获取到文件对象的文件描述符,这里我们使用with open打开上面创建的文件,使用f.fileno()返回了f的文件描述符。

四、os.open()的参数说明

os.open(file, flags[, mode])

file参数是需要打开的文件名。

mode是可选参数,是文件的权限操作,默认是777,我们先不讨论这个参数。

flags的值需要特别注意,它指定可以对打开的文件进行哪些操作,语法比较特殊,必须按照语法要求来传值。

flags的常用值,如果同时使用多个,用管道符 | 隔开:

os.O_CREAT: 创建并打开一个新文件

os.O_RDONLY: 以只读的方式打开

os.O_WRONLY: 以只写的方式打开

os.O_RDWR : 以读写的方式打开

os.O_APPEND: 以追加的方式打开

os.O_NONBLOCK: 打开时不阻塞

os.O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)

os.O_EXCL: 如果指定的文件存在,返回错误

os.O_SHLOCK: 自动获取共享锁

os.O_EXLOCK: 自动获取独立锁

os.O_DIRECT: 消除或减少缓存效果

os.O_FSYNC : 同步写入

os.O_NOFOLLOW: 不追踪软链接

五、os读取文件内容和删除文件

os.chdir('os_folder')
# 创建一个bbb.txt的文件
fd = os.open('bbb.txt', os.O_RDWR|os.O_CREAT)
# 写入内容
os.write(fd, 'bbbbbbb'.encode('utf-8'))
# 关闭文件
os.close(fd)
# 以只读方式打开
fd = os.open('bbb.txt', os.O_RDONLY)
# 从文件描述符fd中读取最多n个字节
print(os.read(fd, 20).decode('utf-8'))
os.close(fd)
# 删除文件
os.remove('bbb.txt')

运行结果:

bbbbbbb

上面的代码中,新建了一个bbb.txt文件,然后写入内容,供我们读取。

os.read(fd, n)表示从指定的文件中读取n个字节的内容,如果n大于文件中内容的长度,则返回文件中的所有内容,如果文件中的内容已经读完了(多次读时),则返回空字符串。

注意:使用一次os.open()方法打开文件后,如果对文件进行写,接着进行读,读取到的内容是空的。需要将文件关闭,然后重新打开再读,才有内容。相当于读的时候,访问到的还是文件刚打开时的状态,而不是文件写入后的状态。

os.remove(file)方法将指定的文件删除,可以接文件的路径。

更多文件操作参考: https://blog.csdn.net/weixin_43790276/article/details/99213784

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43790276/article/details/98674218

智能推荐

.NET 实现实体对象深拷贝(克隆/复制)的几种方法_net 对象复制-程序员宅基地

文章浏览阅读6.7k次。浅拷贝:指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝对象和原对象仅仅是引用名称有所不同,但是它们共用一份实体。对任何一个对象的改变,都会影响到另外一个对象。大部分的引用类型,实现的都是浅拷贝,引用类型对象之间的赋值,就是复制一个对象引用地址的副本,而指向的对象实例仍然是同一个。深拷贝:指对象的子段被拷贝,同时字段引用的对象也进行了拷贝。深拷贝创建的是整个源对象的结构,拷贝对象和原对象相..._net 对象复制

StarRocks x Paimon 构建极速实时湖仓分析架构实践

当前 StarRocks x Paimon 的能力主要包括:支持各类存储系统,包括 HDFS 以及对象存储 S3/OSS/OSS-HDFS支持 HMS 以及阿里云 DLF 元数据管理系统支持 Paimon 的 Primary Key 和 Append Only 表类型查询支持 Paimon 系统表的查询,常见例如 Read Optimized 表,snapshots 表等支持 Paimon 表和其他类型数据湖格式的关联查询支持 Paimon 表和 StarRocks 内表的关联查询。

Java设计模式 _创建型模式_原型模式(Cloneable)

1、原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能比较好。一般对付出较大代价获取到的实体对象进行克隆操作,可以提升性能。(2)、复写clone方法(当前对象本身可以不复写,如果当前对象被继承,需要clone子类,则必须要复写)(1)、需要克隆的实体类实现Cloneable接口。可以看出,完整的复制了属性,且并不是同一个对象。

GPT与GAN结合生成图像——VQGAN原理解析

这篇文章,我们讲VQ_GAN,这是一个将特征向量离散化的模型,其效果相当不错,搭配Transformer(GPT)或者CLIP使用,达到的效果在当时可谓是令人拍案叫绝![GPT与GAN结合生成图像——VQGAN原理解析-哔哩哔哩]效果演示:图像生成其他任务。

希尔(谢尔)排序/缩小增量排序(Python实现)_希尔排序dk=1-程序员宅基地

文章浏览阅读280次。排序-希尔排序文章目录排序-希尔排序时间线前言定义一图流逻辑逻辑思考时间复杂度实现Python思考时间线 2020年7月4日——完成初稿 2020年7月4日——增加时间性能测试前言从学习算法到这篇笔记完成之前,一直都以为希尔排序是多么难懂以及高大上,但其实只要弄懂了就简单了。以前觉得只要掌握一些常见的即可,但后来才发现,其它的排序算法也有其独特的魅力——不是说这个算法可以实现了什么完成了什么,其魅力在于实现的过程,与其它算法的区别。定义一图流希尔排序是直接插入排序算法的改进,所_希尔排序dk=1

今天开始学Pattern Recognition and Machine Learning (PRML)书,章节1.2,Probability Theory 概率论(上)...-程序员宅基地

文章浏览阅读146次。原创书写,转载请注明出处http://www.cnblogs.com/xbinworld/archive/2013/04/25/3041505.html今天开始学Pattern Recognition and Machine Learning (PRML)书,章节1.2,Probability Theory (上)这一节是浓缩了整本书关于概率论的精华,突出一个不确定性(unc..._荆炳义 高等概率论讲义 pdf

随便推点

C语言中vu16什么意思,规范化编程-程序员宅基地

文章浏览阅读2.2k次。题目:规范化和模块化编程0引言通过一年多的编程经历,经常会为杂乱无章的程序弄的晕头转向,影响编程质量和进度。同时也为了程序的可移植性和可读性,规范化和模块化编程应该在开始编写的第一个程序时就要有规范化和模块化编程的思想,并在实践中运用,养成规范化和模块化编程的好习惯。1规范化编程谈到规范性编程这里我们是在符合c语言基本运用原理的基础上加以说明,以下我们主要讲以下几个方面:1.1 定义一个自己con..._vu16

java基础之Integer比较问题_new integer创建了几个对象-程序员宅基地

文章浏览阅读1.5k次。一. 使用 new Integer() 创建的对象 :Integer i = new Integer(100); Integer j = new Integer(100); System.out.println(i==j); 执行上述代码,打印结果是:false上述代码中我们执行了两次new,所以创建了两个Integer型的对象,对象之间的“==”符是用来比较是否是一个对象的两个引用(即比较地址是否相同),上述代码中,两次new出来的对象地址显然是不可能相同的,故打印结果是false_new integer创建了几个对象

euclidea4攻略_Euclidea几何构建9.4通关攻略-程序员宅基地

文章浏览阅读1k次。Euclidea几何构建全关卡通关攻略大全玩腻味了哪些大开发商的游戏,小编给大家推荐一款挺有意思的小游戏Euclidea。Euclidea几何构建是一款具有理科生浪漫的游戏,这是一款数学几何风格的休闲益智类手游,玩法就是尺规做图,根据每个关卡给出的道具和要求,以在最短的步骤内解出答案。想说这游戏的趣味就是难度不是一点二点的,有兴趣的大家可以试试。euclidea几何构建全关卡通关攻略Euclide..._几何构建攻略

【算法】前缀和

前缀和,实际上是一种非常简单的动态规划,通过预处理前缀和数组,以空间换时间,提高运行效率。

php7.4在foreach中对使用数据使用无法??[]判读,无法使用引用传递&

代码如下图:这样子在foreach中是无法修改class_history的。

pdf转换成byte放入mysql_如何将生成的pdf文件保存到java中的mysql数据...-程序员宅基地

文章浏览阅读357次。我有一个使用itext库生成pdf文件的java类.现在根据我的需要,我必须将生成的pdf文件保存到mysql数据库表中,但是我不知道该怎么做.我的担心是:…1.我可以在pdf表的mysql列中提供什么数据类型以保存pdf文件.2.哪个查询将生成的pdf文件插入数据库..目前,我正在生成pdf文件,并将其存储到本地磁盘的硬编码文件路径中.这是我在java中的pdf生成代码…OutputStream..._java:mysql数据库据转换pdf格式并打印机输出java:mysql数据库据转换pdf格式并打印

推荐文章

热门文章

相关标签