文件操作

1. 找到这个文件. 双击打开它

open(文件路径, mode="", encoding="")
文件路径:
1. 绝对路径
d:/test/xxxx.txt
2. 相对路径
相对于当前你的程序所在的文件夹
../ 上一层文件夹
mode:
r : read 读取
w : write 写
a : append 追加写入
b : 读写的是非文本文件 -> bytes with: 上下文, 不需要手动去关闭一个文件 修改文件:
1. 从源文件中读取内容.
2. 在内存中进行调整(修改)
3. 把修改后的内容写入新文件中
4. 删除源文件. 将新文件重命名成源文件
5. 最后要执行f.close()——操作完成后,不要忘记关闭文件! 在Python中,当你打开一个文件进行读写操作时,操作系统会为这个文件分配一些资源(如内存空间)。如果文件使用完毕后不及时关闭,可能会导致资源浪费,甚至出现数据错误或丢失的情况。
因此,执行f.close()是为了在完成文件操作后及时关闭文件,释放系统资源,并确保数据的完整性和安全性。这是一种良好的编程习惯,也是Python中推荐的文件操作方式。
使用with语句可以更方便地处理文件关闭问题。with语句会自动管理文件对象的生命周期,在代码块执行完毕后自动关闭文件,无需手动调用f.close()方法。但是,在某些特殊情况下,比如需要提前结束文件操作时,手动调用f.close()也是可以的。

打开文件:open("文件路径", mode="r", encoding="utf-8")

文件路径分为:绝对路径 or 相对路径:

绝对路径:

open ("/opt/db/abc.txt", mode="r", encoding="utf-8")

相对路径:

#和程序同层级目录
open ("国产自拍.txt", mode="r", encoding="utf-8")
#在本程序上一层目录下的其他目录
open ("../葫芦娃.txt", mode="r", encoding="utf-8")
#上一层目录下的/代码/目录
open ("../01_初识python/代码/倚天屠龙记.txt", mode="r", encoding="utf-8")

完整的打开格式open("国产自拍.txt", mode="r", encoding="utf-8")

f = open("国产自拍.txt", mode="r", encoding="utf-8")
content = f.read() # 全部读取
print(content)
f.close() #运行结果
葫芦娃
葫芦娃
一根藤上七朵花
风吹雨打都不怕
啦啦啦啦啦.........

*注意事项

  1. 在操作文本文档时,encoding="utf-8"这条代码可以不写,但是建议写上,因为不写的时候根据你的操作系统默认标记.(MAC操作系统默认是utf-8,Windows中文版本默认是GBK)
  2. mode="r"可以被缩写成"r"如:open("国产自拍.txt", "r", encoding="utf-8")
  3. 在读写非文本文件的时候要加上b,比如读取读取图片,非文本mode="rb",并且图片在计算机里是二进制存储的(01010110),不能带encoding="utf-8"编码参数。
  4. 执行f.read()f.write()这类操作之前,必须先打开文件,要执行open
  5. 执行f.close()后文件关闭,也不能再执行读or写操作
  6. 使用with用法后,文件会自动关闭,with外也不能再执行读写操作,还需要执行open
  7. 在Python中,双引号""和单引号''都用于表示字符串,它们在大多数情况下是可以互相替代的,没有本质的区别。你可以根据个人偏好或者特定的语境选择其中之一。

在不指定encoding参数的情况下,open函数会使用默认的系统编码。最好还是明确指定encoding="utf-8"参数,以确保正确处理文本文件。

  • Windows 10英文版系统,它的默认编码通常是CP1252(Windows-1252)
  • Windows 10中文版系统,它的默认编码通常是GBK(CP936)
  • Windows 10台版本系统,它的默认编码通常是Big5-HKSCS 编码(Big5 字符集的扩展)
  • MAC操作系统默认是UTF-8(中文&英文)

读取文件:r模式mode ="r"

执行读取的几种方法:

content = f.readable() 可以读取到内容
content = f.read() 全部读取
content = f.readlines()  把所有行都打印出来
content = f.readline()   一行一行读取
content = f.readline().strip()  去掉字符串左右两端的空白:空格, 换行, 制表符

     

为了方便解释,我们先执行content = f.readlines()这个操作是把原文的每一行都拿出来,然后放入列表里.

f = open("国产自拍.txt", mode="r", encoding="utf-8")
content = f.readlines() #把所有行都打印出来
print(content)
f.close() #执行结果
['葫芦娃\n', '葫芦娃\n', '一根藤上七朵花\n', '风吹雨打都不怕\n', '啦啦啦啦啦.........']

对比原文和content = f.readlines()我们可以看到,其实每个字段后面都是跟着\n的,\n其实就是换行。

对比来看content = f.readline() 这是一行一行读取的操作命令,并且每执行一次,程序的指针会自动换到下一行

f = open("国产自拍.txt", mode="r", encoding="utf-8")
line = f.readline()
print(line)
line = f.readline()
print(line)
line = f.readline()
print(line)
f.close() #运行结果
葫芦娃 葫芦娃 一根藤上七朵花

*这里需要解释一下,文本中本身就存在\n换行。再加上python程序每执行一次print(*)命令后,内部会默认执行一次end='\n'换行,因此会出现多1次换行的现象。

为此,需要增加content = f.readline().strip()命令来去掉字符串左右两端的空白。包括:空格,换行,制表符。这里程序本身的换行,是靠print(*)命令内部实现的。

f = open("国产自拍.txt", mode="r", encoding="utf-8")
line = f.readline().strip() # 去掉字符串左右两端的空白,包括(空格, 换行, 制表符)
print(line)
line = f.readline().strip()
print(line)
line = f.readline().strip()
print(line)
f.close() #运行结果
葫芦娃
葫芦娃
一根藤上七朵花

存在这些读取方式的区别是因为,如果文件足够大(10GB),那会严重影响程序的内存占用率,

因此这两种操作方式,都可能使内存占满

content = f.read() 全部读取
content = f.readlines()  把所有行都打印出来

为此,应采取readline()的操作方式去使用,会更加安全

content = f.readline()   一行一行读取
content = f.readline().strip()  去掉字符串左右两端的空白:空格, 换行, 制表符

但是为了便捷打印多行,python允许把f (open操作)加入循环

*最重要的一种文本读取方式(必须掌握)

f = open("国产自拍.txt", mode="r", encoding="utf-8")
for line in f: # 从f中读取到每一行数据
print(line.strip()) #必须加入.strip,不然会多换行
f.close() # 不要忘记关闭文件!

这是一种很公用的,大多数的通用读取方案.

写入文件:w模式mode ="w"

w模式下. 如果文件不存在. 自动的创建一个文件

w模式下. 每一次open都会清空掉文件中的内容

f = open("嫩模.txt", mode="w", encoding="utf-8")
f.write("胡辣汤")
f.close() # 每次操作之后养成好习惯.要关闭链接

准备一个列表.要求把列表中的每一项内容. 写入到文件中

lst = ['张无忌', "汪峰", "章子怡", "赵敏"]
f = open("打架.txt", mode="w", encoding="utf-8") # 大多数情况下要把open写循环外面 for item in lst:
f.write(item)
f.write("\n") f.close() # 不要忘记关闭文件!

如果不加入"\n",就不会换行

写入文件:a模式mode ="a"——在末尾追加

f = open("打架.txt", mode="a", encoding="utf-8")
f.write("你好厉害")
f.close() # 不要忘记关闭文件!

with用法: with open() as *:

它是一种上下文管理器,能够确保在这部分代码块执行完成后文件会被正确关闭,即便是后面的脚本发生了异常也没关系。with语句会在代码块执行前自动打开文件,并在代码块执行完毕后自动关闭文件。这样可以确保文件在使用完毕后被及时关闭,是一种更安全的文件处理方式。

不需要手动去关闭一个文件,但是with后要以冒号结束,并且下一行需要缩进排版,缩进的命令代表在with内部。如果命令和with并排,代表在with动作外。with执行完成后,文件会自动被关闭。

总之,推荐使用 with 语句,因为它能够提供更好的代码健壮性,确保资源在正确的时候被释放。

使用with语句的版本:

with open("国产自拍.txt", mode="r", encoding="utf-8") as f:
for line in f:
print(line.strip())

这种写法就等效于使用openclose的版本:

f= open("国产自拍.txt", mode="r", encoding="utf-8")
for line in f:
print(line.strip())
f.close()

这个版本手动调用了f.close()来关闭文件。虽然这样也可以正常工作,但是如果在文件操作过程中发生异常,可能导致文件没有被关闭,因为close语句可能不会被执行。因此,使用with语句可以更好地确保文件的正确关闭,尤其是在处理文件时可能发生异常的情况下。

验证实验:在with外增加f.readline()这些读or写的操作,都会报错

with open("国产自拍.txt", mode="r", encoding="utf-8") as f:
for line in f:
print(line.strip())
print(f.readline())

提示ValueError: I/O operation on closed file.文件关闭后不可以I/O输出

想要读取图片,在读写非文本文件的时候要加上b,比如读取非文本mode="rb",并且图片在计算机里是二进制存储的(01010110),不能带encoding="utf-8"编码参数。

with open("胡一菲.jpeg", mode="rb") as f:
for line in f:
print(line)

想要完成文件的复制: 从源文件中读取内容. 写入到新路径去with open("源文件", mode="rb") as f1, open("新路径", mode="wb") as f2:

with open("胡一菲.jpeg", mode="rb") as f1, \
open("../01_初识python/胡二飞.jpeg", mode="wb") as f2:
for line in f1:
f2.write(line)

这里需要注意,因为一行代码太长,刻意使用到了\符号,\代表转行(未完待续),实际代码等效为with open("胡一菲.jpeg", mode="rb") as f1, open("../01_初识python/胡二飞.jpeg", mode="wb") as f2:

文件修改:

第1步,把文件中开头以"周" -> "张",然后存入临时副本中。

with open("人名单.txt", mode="r", encoding="utf-8") as f1, \
open("人名单_副本.txt", mode="w", encoding="utf-8") as f2:
for line in f1:
line = line.strip() # 去掉换行/n
if line.startswith("周"):
line = line.replace("周", "张") # 字符串操作不可变,需要重新赋值 f2.write(line)
f2.write("\n")

第2步,删除原始文件。把临时副本中的文件替换为原始文件。

import os    # python要调用os操作系统相关的模块,要引用os

os.remove("人名单.txt")    # 删除源文件
os.rename("人名单_副本.txt", "人名单.txt") # 把副本文件重命名成源文件

运行此命令时,程序瞬间执行完成,让用户感知不到整改操作过程,以为是对源文件进行的操作替换.

为此我们可以加入时间概念,让程序等待3秒再执行,格式为:

import time  # python要调用和时间相关的模块,要引用time

time.sleep(3)  # 让程序休眠3秒钟

因此整段代码应为:

import os
import time with open("人名单.txt", mode="r", encoding="utf-8") as f1, \
open("人名单_副本.txt", mode="w", encoding="utf-8") as f2:
for line in f1:
line = line.strip() # 去掉换行
if line.startswith("周"):
line = line.replace("周", "张") # 重新赋值才可以替换 f2.write(line)
f2.write("\n") time.sleep(3) # 让程序休眠3秒钟
os.remove("人名单.txt") # 删除源文件
time.sleep(3) # 让程序休眠3秒钟
os.rename("人名单_副本.txt", "人名单.txt") # 把副本文件重命名成源文件

Python——第二章:文件操作的更多相关文章

  1. 简学Python第二章__巧学数据结构文件操作

    #cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...

  2. python os&shutil 文件操作

    python os&shutil 文件操作 # os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于W ...

  3. python 历险记(三)— python 的常用文件操作

    目录 前言 文件 什么是文件? 如何在 python 中打开文件? python 文件对象有哪些属性? 如何读文件? read() readline() 如何写文件? 如何操作文件和目录? 强大的 o ...

  4. Python的高级文件操作(shutil模块)

    Python的高级文件操作(shutil模块) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果让我们用python的文件处理来进行文件拷贝,想必很多小伙伴的思路是:使用打开2个 ...

  5. Python入门篇-文件操作

    Python入门篇-文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.文件IO常用操作 open:打开 read:读取 write:写入 close:关闭 readlin ...

  6. python基础篇(文件操作)

    Python基础篇(文件操作) 一.初始文件操作 使用python来读写文件是非常简单的操作. 我们使用open()函数来打开一个文件, 获取到文件句柄. 然后通过文件句柄就可以进行各种各样的操作了. ...

  7. Python之常用文件操作

    Python之常用文件操作

  8. Python学习笔记 -- 第六章 文件操作

    I/O编程 在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这 ...

  9. 2 python第三章文件操作

    1.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成立 els ...

  10. 百万年薪python之路 -- 文件操作

    1.文件操作: f = open("zcy.txt" , mode="r" , encoding="UTF-8") open() 打开 第一 ...

随机推荐

  1. MySQL实战实战系列 03 事务隔离:为什么你改了我还看不见?

    提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务.最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱. 转账过程具体到程序里会有一系列的操作,比如 ...

  2. 内网离线安装docker并配置使用nexus为docker私服

    背景 本文简单记录下最近在内网服务器离线安装docker及配置nexus作为docker私服,踩的一些坑.docker和k8s这块技术我跟得不是很紧,18年的时候用过一阵docker,后来发现它并不能 ...

  3. 圆柱坐标系(Cylindrical Coordinate System)

    参考:维基百科 圆柱坐标系(英语:cylindrical coordinate system)是一种三维坐标系统.它是二维极坐标系往 z-轴的延伸.添加的第三个坐标 \(z\) 专门用来表示 P 点离 ...

  4. [SUCTF 2019]CheckIn 1

    看到字符upload 就想到了文件上传漏洞 就先上传一个一句话木马试试 似乎直接上传不成功,可能是有什么过滤 再上传一个包含一句话木马的图片试试 发现提示不能是图片,这时候就不会了,在网上找了一下wp ...

  5. VLAN虚拟网络

    VLAN 名称:vlan 虚拟局域网(virtual LAN) 用途 由于交换机所有的端口都在同一广播域,只要发送广播会产生大量的垃圾信息,同时会有病毒的安全隐患(病毒). 为了解决上述问题 1.物理 ...

  6. 关于Xftp7和Xshell7是最新版本但是报错这件事

    以win11为例,仅供参考.只能说捣鼓这么久还是建议各位转用MobaXterm. 先说一下,我的解决方法只能说是跳过问题,不是解决问题. <要继续使用此程序 您必须应用最新的更新或使用新版本&g ...

  7. 用xshell连接vmware虚拟机

    主要是为了方便写命令,我的vmware不管怎样都没办法粘贴命令,写建表sql更是折磨. 开启虚拟机用ifconfig查看内网ip地址. 然后在用户身份验证填用户名和密码. 连接成功. 这样就可以开多个 ...

  8. Redis 7.0 源码环境搭建与阅读技巧

    天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server. 有人说,组 CP,除了要了解她外,还要给机会让她了解你. 那么,作为开发工程师的你,是 ...

  9. CF1523D Love-Hate 题解

    抽象化题意: 一共有 \(m\) 个元素,给定 \(n\) 个集合,每个集合的元素不超过 \(15\) 个,求出一个元素个数最多的集合 \(S\) 是至少 \(\lceil \dfrac{n}{2} ...

  10. 文件 inode 与 no space left on device 异常

    转载请注明出处: 文件inode 在 Linux 文件系统中,每一个文件或目录都会有一个 inode,它是一个数据结构,用于存储文件的元数据,比如文件的权限.所有者.大小.创建和修改的时间等.inod ...