python中的文件读写

文件读写,是Python代码调用电脑文件的主要功能,能被用于读取和写入文本、音频片段、Excel文档、邮件以及任何保存在电脑上的东西。

可使用python批量的操作本地文件,进行文件的读写。

拓展路径小知识

读写文件需要让计算机先找到文件的路径,而编写路径代码前我们人类得先准确找到文件路径。

以下整理路径相关知识

相对路径和绝对路径

绝对路径:就是最完整的路径

相对路径:指的就是【相对于当前python文件】的路径

路径获取

1、文件拖拽的方式(mac)

要获得你的文件路径,只需要把目标文件直接拖到编辑器终端的窗口里(我这里用的vscode的终端。或可以用电脑自带的命令行),就会显示出文件地址,然后复制一下就好。拖到终端获取的地址是绝对路径。

出现路径:

只针对mac。

因为win的vscode终端里,路径显示的很完整了。拷贝之后改为"\\"即可。

2、VScode里的快捷选项

用VS Code打开文件夹,选中文件后点击右键,选择“复制路径”或“复制相对路径”(mac和win通用):

3、pwd命令

mac电脑中,还可以在命令行中使用pwd获取当前cmd打开时所在文件夹的路径。

“\”在python中需要转义

特殊的:Windows系统里,常用“\”来表示绝对路径,但是“\”在python中是转义字符,所以时常会有冲突。为了避坑,Windows的绝对路径通常要稍作处理,写成类似以下两种形式:

#第一种:将'\'替换成'\\'
'C:\\Users\\Ted\\Desktop\\test\\abc.txt'

#第二种:在路径前加上字母r
r'C:\Users\Ted\Desktop\test\abc.txt'

读取文件

问,把大象放到冰箱需要几步?
答:打开冰箱 - 放入大象 - 关上冰箱

再问,读取文件需要几步?
答:打开文件 - 读取信息 - 关闭文件

打开文件

使用open()函数打开文件

openResult = open('/Users/.../demo.txt','r',encoding='utf-8')
# openResult变量用于存放open读取的文件数据,以便对其进行后续操作。

open各参数说明:

参数 说明
地址参数 open函数内的第一个参数,表示文件的路径。可以是绝对路径、也可以是相对路径。
r 第二个参数表示打开文件的模式。这里是字符串 'r',表示 read,表示我们以读的模式打开了这个文件。
encoding='utf-8' 表示的是返回的数据采用何种编码,一般采用'utf-8'或者'gbk'。

注意:如果这里填写的编码类型和文件本身的编码格式不一致的话,就会报错。

上图用“utf-8”编码模式打开,但是文本的编码实际是“ANSI”。就报了这种错误。

读取

read()函数将整个文件一次性读取出来

readResult = openResult.read() # 文件读取后的字符串内容赋值给readResult变量
print(readResult) # 可以打印出读取的内容

read() 会从txt文件取出全部内容,是一个字符串。

readlines()函数逐行读取文件的内容

readResult = openResult.readlines() # 逐行读取
print(readResult)

readlines() 会从txt文件取得一个列表,列表中的每个字符串就是读取的文件中的每一行。而且每个字符串后面还有换行的\n符号。

如有txt文件,内容如下:

小石头 100 93 83
郭菊锋 89 67 9
xing.org1^ 23 48 100

则用上边的代码readlines()读取后,打印readResult的结果就是长这样的:

['小石头 100 93 83\n', '郭菊锋 89 67 9\n', 'xing.org1^ 23 48 100']

这样就可以用for循环遍历列表,逐行处理数据。(具体做法可以看最后边的小练习)

关闭文件

使用的是close()函数

openResult.close() # 直接关闭即可

文件关闭的必要性:

1.计算机能够打开的文件数量是有限制的,open()过多而不close()的话,就不能再打开文件了。

2.能保证写入的内容已经在文件里被保存好了。

文件关闭之后就不能再对这个文件进行读写了。
如果还需要读写这个文件的话,就要再次 open() 打开这个文件。

读取文件总结三步

openResult = open('/Users/.../demo.txt','r',encoding='utf-8') # 1、打开
readResult = openResult.read() # 2、读取
print(readResult) # 2+1、可以对读取的文件进行使用操作
openResult.close() # 3、关闭

文件写入

问,把大象放到冰箱需要几步?
答:打开冰箱 - 放入大象 - 关上冰箱

再问,文件写入需要几步?
答:打开文件 - 写入信息 - 关闭文件

打开文件

同样还是使用open()函数打开文件

但第二个参数,打开的模式要改变一下:

openResult = open('/Users/.../demo.txt','w',encoding='utf-8')
# openResult变量用于存放open打开的文件的数据,以便对其进行后续操作。

或者另一种写法:

openResult = open('/Users/.../demo.txt','a',encoding='utf-8')

open各参数说明(其他参数见上边表格,这里重点说第二个参数):

参数 说明
w 第二个参数表示打开文件时的模式。字符串'w'表示 write,即以写入的模式打开文件。不过值得注意的是,‘w’是覆盖式写入,新write的内容会覆盖该文件原有的内容。表现上就是先清空文件内容,再写入。
a 字符串'a'表示append,顾名思义,就是向后追加的意思。其和'w'作用一样都是向文件中写入的模式。不过append更人性化的是,向原有文件的内容之后追加内容,而不是直接覆盖源文件的内容。

在'w'和'a'模式下,如果你打开的文件不存在,那么open()函数会自动帮你创建一个,不会报错。

写入

使用write()函数往文件中写入一个内容

openResult.write('小石头\n') # 向openResult中写入内容。write参数必须是字符串,表示要写入的内容
openResult.write('xing.org1^\n') # \n表示换行符。
print(openResult)

注意,写入时,write函数内容不要尝试用数字,不然你会体会到报错的报复:

那我们就想写入一个序列(列表)的话,该怎么做呢?

使用writelines()函数向文本中写入序列内容

listVal = ['小石头\n', 'xing.org1^\n'] # 一个待写入的列表。要换行还要自己加入换行符
openResult.writelines(listVal) # writelines参数接受一个序列

关闭文件

关闭文件,依旧使用close()函数

openResult.close() # 直接关闭即可

总结三步

重写文件内容:

# 用write模式打开文件
openResult = open('/Users/.../demo.txt','w',encoding='utf-8') # 1、打开(write)
openResult.write('小石头\n') # 2、覆盖源文件内容、写入
openResult.write('xing.org1^\n')
openResult.close() # 3、关闭

或者,追加内容:

# 用append模式打开文件
openResult = open('/Users/.../demo.txt','a',encoding='utf-8') # 1、打开(append)
openResult.write('小石头\n') # 2、向源文件内容之后追加、写入
openResult.write('xing.org1^\n')
openResult.close() # 3、关闭

此时可以观察,txt文件里的内容已经被修改了

open函数

打开文件的几种模式

参照上边的代码,open函数调用时,第二个参数就需要传入是r还是w亦或者是其他模式,表示只读还是只写还是其他等等。

为什么打开的时候就要决定是读还是写的模式,之后决定不行吗?

这是因为,计算机非常注意数据的保密性,在打开时就要决定以什么模式打开文件。

而除了'r',还有'w'(写入),'a'(追加)等模式,详见下表:

模式 全写 含义 说明 文件不存在
r read 只读模式 读取文件 文件不存在就报错,
文件存在指针在开头
从头开始,扫描读取
w write 只写模式 覆盖源文件,写入新数据 文件不存在就新建,
存在就覆盖
a append 追加模式 在源文件内容的基础上
追加写入新内容
文件不存在新建,
存在指针放到末尾追加内容
  • read文件不存在就报错

二进制资源读写

w和a写入的都是文本内容。

如果想写入图片、视频、音频等这些以二进制形式进行存储的资源内容时,需要使用‘wb’这些以二进制的方式打开并读写文本的模式。

模式
分类
普通
模式
b
(bytes,字节)
+ b+ 文件
不存在
read
(读取)
r 只读 rb 二进制只读 r+ 读写 rb+ 二进制读写 报错
write
(写入)
w 只写 wb 二进制只写 w+ 读写 wb+ 二进制读写 新建文件
append
(追加)
a 追加 ab 二进制追加 a+ 追加且可读 ab+ 二进制追加且可读 新建文件

with关键字

使用with配合open函数来读取文件,可以不用写close()来关闭文件。这样可以防止我们代码最后忘记关闭文件或频繁关闭文件,造成资源占用或代码冗余的情况。

格式

with open() as xxx:

语法

with open('文件地址','读写模式') as 变量名: #格式:注意冒号
    变量名.write('写入内容') #冒号下对文件的操作要缩进

#最后无需用close()关闭

写法

with open('./demo.txt','a') as openResult:
    openResult.write('小石头')

python克隆图片

原理,用python读取一个图片文件,然后再写入一个新的图片文件。实现图片的拷贝克隆功能。

with open('photo1.png', 'rb') as photo1: # 打开原图photo1.png,rb只读二进制资源模式
    result = photo1.read() # 将读取结果赋值给result
    with open('photo2.jpg', 'wb') as photo2: # 打开新图photo2.jpg,wb只写模式,没有该文件将创建一个新文件。
        photo2.write(result) # 创建的新文件中,写入photo1的数据,实现图片克隆。

小练习

文件读写操作小练习:

本地一个demo.txt文件,文件内容如下:

<!-- 原来的,demo.txt文件内容 -->
小石头 100 93 83
郭菊锋 89 67 9
xing.org1^ 23 48 100

分别是三个人的语文、数学、英语成绩。

练习目标是读取文件后计算三人的总成绩。然后写到demo文件下,生成格式如:

<!-- 修改后,demo.txt文件内容 -->
小石头 100 93 83
郭菊锋 89 67 9
xing.org1^ 23 48 100

总分:
小石头 276
郭菊锋 165
xing.org1^ 171

练习参考答案及源代码

- END -

【python系统学习17】python中的文件读写的更多相关文章

  1. Python笔记之 - 一张截图诠释"文件读写" !

    Python笔记之 - 一张截图诠释"文件读写" ! 源代码如下: # 文件读写 str_test1 = "先创建txt文件再写入内容: 我是大帅哥" # wi ...

  2. python开发学习-day01 (python安装与版本、字符串、字典、运算符、文件)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  3. Python 系统学习梳理_【All】

    Python学习 1. Python学习---Python安装与基础1205 2. Python学习---PyCharm的使用学习 3. Python学习---Python数据类型1206 4. Py ...

  4. Python入门学习系列——Python文件和异常

    从文件中读取数据 首先准备一个文本文件,文件中存储着普通文本数据.读取文件需要调用open()和read()函数. 读取整个文件 代码示例: with open('pi_digits.txt') as ...

  5. 【Python系统学习】基础篇

    这次真的是最后一次了!第三次滚Python的基础.走了太多弯路.认真一点!菜鸟! 教程 转义字符 \ 可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\\表示的字符就是\ ...

  6. python中的文件读写(open()函数、with open('file_directory','r') as f:、read()函数等)

    python中也有文件读写,通过调用内置的读写函数.可以完成文件的打开/关闭.读.写入.追加等功能. open()函数 open()函数为python中的打开文件函数,使用方式为: f = open( ...

  7. Python for Data Analysis 学习心得(三) - 文件读写和数据预处理

    一.Pandas文件读写 pandas很核心的一个功能就是数据读取.导入,pandas支援大部分主流的数据储存格式,并在导入的时候可以做筛选.预处理.在读取数据时的选项有超过50个参数,可见panda ...

  8. python编程学习--Pygame - Python游戏编程入门(0)---转载

    原文地址:https://www.cnblogs.com/wuzhanpeng/p/4261015.html 引言 博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因 ...

  9. Python语言学习之Python入门到进阶

    人们常说Python语言简单,编写简单程序时好像也确实如此.但实际上Python绝不简单,它也是一种很复杂的语言,其功能特征非常丰富,能支持多种编程风格,在几乎所有方面都能深度定制.要想用好Pytho ...

随机推荐

  1. linux gdb 入门级教程(小白专用)

    送给包含我在内的所有小白: 对于养linux真姬的本小白来说,既然你选择养它,那你就要满足他. 如果你养了它是为了码代码,那我觉得gdb应该是它的基本需求了吧?! 然而gdb哪有那些IDE来的简单啊, ...

  2. Python元组内置函数

    Python元组内置函数: len(元组名): 返回元组长度 # len(元组名): # 返回元组长度 tuple_1 = (1,2,3,'a','b','c') print("tuple_ ...

  3. PHP octdec() 函数

    实例 把八进制转换为十进制: <?php高佣联盟 www.cgewang.comecho octdec("36") . "<br>";echo ...

  4. Spring学习总结(6)-@Component和@ComponentScan注解

    参考文档:https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/core.html#beans-ste ...

  5. LeetCode(2)---路径总和

      给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = ...

  6. Spring Joinpoint

    如果用maven管理 则需要 <artifactId> aopalliance </artifactId> <artifactId> spring-aspects ...

  7. 数据分析学习 third week (7.29~8.4)

    概率分布简介 简单地介绍下常用概率分布的理论知识. 基础概念 1.概率 概率直观上是指一个事件发生可能性大小的数量指标 概率的统计定义:在不变的条件下,重复进行$n$次试验,事件$A$发生的频率稳定在 ...

  8. Springboot快速入门篇,图文并茂

    Springboot快速入门篇,图文并茂 文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star!搜索关注微信公众号 [码出Offer] 领取各种学习资料! image-20 ...

  9. java SFTP工具类

    需要导入jsch-0.1.52.jar import java.io.File; import java.io.FileInputStream; import java.io.FileOutputSt ...

  10. Java—API/Obiect类的equals toString方法/String类/StringBuffer类/正则表达式

    API  Java 的API(API: Application(应用) Programming(程序) Interface(接口)) 就是JDK中提供给我们使用的类,这些类将底层的代码实现封装了起来 ...