百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

【文件管理】

sinye56 2025-01-04 22:58 10 浏览 0 评论

  • 1 文件操作流程
  • 2 打开文件的模式
  • 3 文件对象的具体操作3.1 read()3.2 fileno()3.3 write()3.4 readline()3.5 readlines()3.6 遍历文件所有内容3.7 tell()3.8 seek()3.9 flush()3.10 truncate()3.11 close()3.12 file.name3.13 file.closed3.14 file.encoding3.15 file.mode3.16 文件内容的修改
  • 4 with ... as ...
  • 作业1. 实现shell的sed功能2. 修改haproxy配置文件

1 文件操作流程

对文件的操作流程:

  • 打开文件,得到文件句柄并赋值给一个变量
  • 通过句柄对文件进行操作
  • 关闭文件

现有文件如下:

view codes

# coding:utf8

f = open('wangqing') # 打开文件

first_line = f.readline()

print('first line:', first_line) # 读一行

print('我是分隔线'.center(50, '-'))

data = f.read() # 读取剩下的所有内容,文件大时不要用

print(data) # 打印文件

f.close() # 关闭文件

注意 if in the win,wangqing文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统默认的是gbk编码,所以直接打开会乱码,需要

f=open('wangqing',encoding='utf8')

wangqing文件如果是gbk保存的,则直接打开即可。

2 打开文件的模式

========= ===============================================================

Character Meaning

--------- ---------------------------------------------------------------

'r' open for reading (default)

'w' open for writing, truncating the file first

'x' create a new file and open it for writing

'a' open for writing, appending to the end of the file if it exists

'b' binary mode

't' text mode (default)

'+' open a disk file for updating (reading and writing)

'U' universal newline mode (deprecated)

========= ===============================================================

打开文件的模式有:

  • r,只读模式(默认)
  • w,只写模式。【不可读;不存在则创建;存在则覆盖原内容;】
  • a,追加模式。【不可读;不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+,可读写文件。【能读能写,追加写】
  • w+,写读。【能读能写,覆盖写】
  • a+,同a。【能写能读,追加写】

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

  • rU
  • r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

  • rb
  • wb
  • ab

# f = open('wangqing','w') #打开文件# f = open('wangqing','a') #打开文件# f.write('忘情公子1\n')# f.write('忘情2\n')# f.write('至圣!3')

rb模式:

f = open('wangqing','rb') # 以写读模式打开文件

f.read(3)

f.seek(3)print(f.read(3)) # b'\xaa\xe4\xb8'

f.seek(3,1)print(f.read(3)) # b'\x98\xe6\x83'

f.seek(-4,2)print(f.read(3)) # b'\x81\xe3\x80'

# for line in f:# print(line.decode())

总结: 在py3中,如果你想要字符数据,即用于观看的,则用r模式,这样我f.read到的数据是一个经过decode的unicode数据; 但是如果这个数据我并不需要看,而只是用于传输,比如文件上传,那么我并不需要decode,直接传送bytes就好了,所以这个时候用rb模式。

在py3中,有一条严格的线区分着bytes和unicode,比如seek的用法,在py2和py3里都是一个个字节的seek,但在py3里你就必须声明好了f的类型是rb,不允许再模糊。

建议: 以后再读写文件的时候直接用rb模式,需要decode的时候再显示地去解码。

3 文件对象的具体操作

3.1 read()

file.read()方法明确指定从文件中指定要读取多少个字节结果返回成一个字符串,若不指定则返回所有内容
例:读取10个字节

f = open('wangqing') # 打开文件

data = f.read(10)print(data)

例:读取所有内容

f = open('wangqing') # 打开文件

data = f.read()print(data)

3.2 fileno()

file.fileno()方法返回文件对象的文件描述符

f = open('wangqing') # 打开文件

data = f.fileno()print(data)


文件描述符是内核为了高效管理已经被打开的文件所创建的索引,它有以下特点:

  • 非负整数
  • 用于指代被打开的文件
  • 所有执行i/o操作的系统调用都是通过文件描述符完成的

进程通过文件描述符来访问文件。 在程序刚启动的时候默认有3个文件描述符:0(标准输入),1(标准输出),2(标准错误),系统默认提供了 0~2的文件描述符,之后当我们进行 open,create等操作的时候 自动添加进表

当我们新建一个文件,打开open 之后,得到的fd 是从3开始的 因为前面的三个被系统占了在OS X系统下测试 文件描述符表 自增,当释放close之后,fd变成-1,如果再继续新建 则填补之前的空缺。

3.3 write()

file.write(s)表示在file中写入字符串s

f = open('wangqing','a') # 打开文件

f.write('haha')

f.close()

换行加入内容

f = open('wangqing','a') # 打开文件

f.write('\nhaha')

f.close()

进度条应用

3.4 readline()

file.readline()方法执行一次返回一行

f = open('wangqing')

data = f.readline()print(data)# print(f.readline())# print(f.readline())# print(f.readline())

f.close()

3.5 readlines()

file.readlines()方法以列表模式返回文件所有行

f = open('wangqing')

data = f.readlines()print(data)

f.close()

3.6 遍历文件所有内容

打印文件的前3行

f = open('wangqing')for i in range(3):

print(f.readline())

f.close()

打印文件所有行

f = open('wangqing')for line in f.readlines():

print(line)

f.close()

由于 readlines 是一次性获取所有行,若文件数据特别多将会极其占用内存资源,所以一般不用readlines,如果需要读取文件所有行推荐以下方式遍历文件,因为其返回的是一个生成器

f = open('wangqing')

for line in f:

print(line)

需求:打印所有行,在第4行后面加上:'end 3'

3.7 tell()

file.tell()方法用于打印当前指针所在位置,以字节为单位

f = open('wangqing')print(f.tell()) # 处理前打印当前指针位置

data = f.readlines()print(f.tell()) # 处理后打印当前指针位置

f.close()

3.8 seek()

file.seek(offset[, whence])方法用于将文件指针移动到指定位置,你可以理解为就是用鼠标将光标定位到指定的位置

f = open('wangqing')print(f.tell())

data = f.readlines()print(f.tell())

f.seek(0)print(f.tell())

f.close()

offset指定偏移量
whence指定从哪里开始偏移

  • 0表示从文件头开始偏移
  • 1表示从当前位置开始偏移
  • 2表示从文件尾部开始偏移

若不给whence的话默认的从文件头开始偏移

3.9 flush()

file.flush()刷新缓冲区手动同步数据到磁盘中,立即将更改写入硬盘

f = open('wangqing','a+')

f.write('\n天之道,损有余而补不足')

f.flush()

f.seek(0)print(f.read())

f.close()

3.10 truncate()

file.truncate([size])将文件截断为最多size字节也就是说文件被截取后只剩下size字节,常用于清空文件内容

f = open('wangqing','w+')

f.truncate()print(f.read())

f.close()

3.11 close()

file.close()方法关闭文件被关闭的文件无法再从中读取数据

f = open('wangqing')print(f.readline())

f.close()print(f.read())

3.12 file.name

file.name属性直接调用当前文件的全路径名称

f = open('/Users/seancheng/Downloads/test/mycode/wangqing')print(f.name)

f.close()

3.13 file.closed

file.closed返回当前文件是否为关闭状态

f = open('/Users/seancheng/Downloads/test/mycode/wangqing')print(f.closed)

f.close()print(f.closed)

3.14 file.encoding

file.encoding返回当前文件使用的编码

f = open('/Users/seancheng/Downloads/test/mycode/wangqing')print(f.encoding)

f.close()

3.15 file.mode

file.mode返回当前文件的打开模式

f = open('/Users/seancheng/Downloads/test/mycode/wangqing')print(f.mode)

f.close()

3.16 文件内容的修改

需求:将文本第四行修改为:'hello 忘情!'

f = open('wangqing','r+') #以写读模式打开文件

f.readline()

f.readline()

f.readline()

f.readline()print(f.tell())

f.write('hello 忘情')

f.close()

和想的不一样,不管事!那涉及到文件修改怎么办呢?

在 Python 中文件是不能被修改的,若想修改其内容,只能新建一个新文件,将修改后的内容写入其中

4 with ... as ...

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

with open('log', 'r') as f:

pass

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

with open('log1') as obj1, open('log2') as obj2:

pass

作业

1. 实现shell的sed功能

2. 修改haproxy配置文件

需求:原配置文件

相关推荐

程序员:JDK的安装与配置(完整版)_jdk的安装方法

对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...

Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置

一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...

麒麟系统安装JAVA JDK教程_麒麟系统配置jdk

检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...

学习笔记-Linux JDK - 安装&配置

前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

测试员必备:Linux下安装JDK 1.8你必须知道的那些事

1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...

Linux 下安装JDK17_linux 安装jdk1.8 yum

一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...

在Ubuntu系统中安装JDK 17并配置环境变量教程

在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...

如何在 Linux 上安装 Java_linux安装java的步骤

在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

linux安装jdk_linux安装jdk软连接

JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...

linux安装jdk,全局配置,不同用户不同jdk

jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...

运维大神教你在linux下安装jdk8_linux安装jdk1.7

1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...

window和linux安装JDK1.8_linux 安装jdk1.8.tar

Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...

最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?

默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...

取消回复欢迎 发表评论: