python基础入门之文件操作

1|0python基础入门之文件操作

1|1一、文件操作

1|01、文件的概念

文件就是把数据存起来,让程序下次执行时直接使用,省时省力。

1|02、代码打开文件的两种方式

方法一:
f = open(文件路径,读写模式,encoding='utf8')
f.close()
方法二:
with open('a.txt','r'encoding='utf8') as f1:
with子代码块
# with上下文管理的优点是子代码运行结束自动调用close方法关闭资源
# 涉及路径的编写,推荐加上r
eg:
D:a\t\m
r'D:\a\t\m'
因文件路径编写中撬棍'\'跟一些字母的组合会产生特殊的含义导致路径查找混乱,加r可避免
# with支持一次性打开多个文件
with open() as f1,open() as f2,open() as f3:
子代码

1|2二、文件读写模式

1|01、只读模式('r')

以只读方式打开文件。文件的指针将会放在文件的开头,这是默认模式。

with open(r'a.txt','r',encoding='utf8') as f:
print(f.read())
# 文件路径不存在,直接报错;文件路径存在,正常读取文件内容。

1|02、只写模式('w')

打开一个文件只用于写入。如果该文件已存在则将其覆盖,如果该文件不存在,创建新文件。

with open(r'a.txt','w',encoding='utf8') as f:
f.write('干饭了 干饭了\n')
f.write('干饭了 干饭了\n')
# 换行符需自行添加,后续数据对比需注意换行符的存在

1|03、只追加模式('a')

打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

with open(r'D.txt','a',encoding='utf8') as f:
pass #文件路径不存在,自动创建;pass只补全语法,本身无含义。
with open(r'A.txt','a',encoding='utf8') as f:
f.write('放假了 放假了')

1|3三、文件操作模式

1|01、('t')文本模式

默认模式,上面所写的r w a全称是rt wt at

  • 只能操作文本文件
  • 读写以字符为单位
  • 需指定encoding参数,否则会采用计算机默认编码

1|02、('b')二进制模式(bytes模式)

  • 需指定 rb wb ab,可以操作任意类型文件
  • 读写以字节bytes为单位
  • 本身为二进制不需编码

1|4四、文件诸多方法

1|01、read( )

  • 一次性读取文件全部内容,光标停在文件末尾
  • 文件内容比较多时,可能会造成内存溢出
  • 括号内可填写数字,文本模式下,代表读取几个字符

1|02、for循环

一行行读取文件内容,能避免内存溢出

1|03、readline( )

一次只读一行内容

1|04、readlines( )

一次性读取文件内容,按照行数组织成列表的一个个数据值

1|05、readable( )

判断文件是否具备读数据的能力

1|06、write( )

写入数据

1|07、writeable( )

判断文件是否具备写数据的能力

1|08、writelines( )

接收一个列表 ,一次性将列表中所有的数据值写入

1|09、flush( )

将内存中文件数据立刻刷到硬盘 等价于ctrl + s

1|5五、文件内光标的移动

  • 文本模式下read括号内的数字表示读取几个字符
  • 二进制模式下read括号内的数字表示读取几个字节(英文一个字节 中文三个字节)
tell()
获取光标移动的字节数
with open(r'a.txt', 'rb') as f:
data = f.read(8)
print(f.tell()) # 8 移动了八个字节
seek(offset,whence)
offset 控制光标移动的位移量(字节)
# whence 模式
0 基于文件开头移动多少字节
1 基于光标当前所在位置移动多少字节
2 基于文件末尾移动多少字节
12只能在二进制模式下使用, 0无所谓
总结:二进制模式下不需encoding参数,如果文件中有汉字存在,在读的过程中要decode解码才能读出
# 下面要用到的文本文件里面的内容:li让我们一起玩的
with open('a.txt', 'rb') as f:
f.seek(0) # 光标移动到文件开头
print(f.read(2).decode('utf8')) # li
f.seek(3, 1) # 1光标在当前位置 3光标向后移动3个字节
print(f.read(9).decode('utf8')) # 我们一
f.seek(-9, 2) # 2光标在文件末尾 -9光标向前移动9个字节
print(f.read(9).decode('utf8')) # 起玩的

1|6六、文件内数据修改

1|01、覆盖

只占用硬盘一块空间,但数据量大会造成内存溢出。

with open('a.txt', 'r', encoding='utf8') as f:
data = f.read()
# print(data)
new_data = data.replace('jason', 'lina')
with open('a.txt', 'w', encoding='utf8') as f:
f.write(new_data)

1|02、重命名

不会造成内存溢出,但有那么一段时间需要占用硬盘两个地方的空间(可能) ,也可能是在内存中创建了没有刷到硬盘

'''先在另外一个地方写入内容,然后删除源文件,将新文件命名成源文件'''
import os
with open('a.txt', 'r', encoding='utf8') as f1, open('.a.txt.swap', 'w', encoding='utf8') as f2:
for line in f1:
f2.write(line.replace('Jason', 'lina'))
os.remove('a.txt') # 删除文件
os.rename('.a.txt.swap', 'a.txt') # 重命名文件

1|7七、计算机硬盘修改数据的原理

不是直接删除而是改变状态,等待后续数据的覆盖才会被真正删除。


__EOF__

本文作者知了了了了
本文链接https://www.cnblogs.com/zhiliaowang/p/16772787.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   知了了了了  阅读(198)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏