热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python3文件操作(读、写)

文件操作基本流程计算机系统分为:计算机硬件,操作系统,应用程序三部分。内存存不长久硬盘数据的持久化文件操作——数据持久化的一种全栈开发:框架类操作文件的流程:#1.打开文件
文件操作基本流程

计算机系统分为:计算机硬件操作系统应用程序三部分。

内存 存不长久
硬盘 数据的持久化
文件操作 —— 数据持久化的一种
全栈开发:框架类

操作文件的流程:
#1. 打开文件,得到文件句柄并赋值给一个变量
#2. 通过句柄对文件进行操作
#3. 关闭文件

 

coding:文件操作

习惯叫 f file f_obj f_handler fh
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r

#2. 通过句柄对文件进行操作
data=f.read()

#3. 关闭文件
f.close()

f=open('a.txt','r')分析

#1、由应用程序向操作系统发起系统调用open(...)
#2、操作系统打开该文件,并返回一个文件句柄给应用程序
#3、应用程序将文件句柄赋值给变量f

 

文件路径:相对路径、绝对路径
#找到文件详解:文件与py的执行文件在相同路径下,直接用文件的名字就可以打开文件
            # 文件与py的执行文件不在相同路径下,用绝对路径找到文件
#文件的路径,需要用取消转译的方式来表示:1.\\    2.r''
#如果以写文件的方式打开一个文件,那么不存在的文件会被创建,存在的文件之前的内容会被清空
# '\n' 文件的换行
# f = open(r'C:\\Users\\Administrator\\Desktop\\s8_tmp.txt','w',encoding='utf-8')  # \\
f = open(r'C:\Users\Administrator\Desktop\s8_tmp.txt','w',encoding='utf-8')  #文件路径、操作模式、编码  # r''
f.write('哈哈哈')
f.close()

 

 

关闭文件的注意事项

打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:
1、f.close() #回收操作系统级打开的文件
2、del f #回收应用程序级的变量

其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,
而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()

虽然我这么说,但是很多同学还是会很不要脸地忘记f.close(),对于这些不长脑子的同学,我们推荐傻瓜式操作方式:使用with关键字来帮我们管理上下文
with open('a.txt','w') as f:
    pass
 
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
    data=read_f.read()
    write_f.write(data)

注意
注意
文件编码
f = open('歌词','w',encoding='utf-8')    #f:文件操作符 文件句柄 文件操作对象
f.write('7018201890')
f.close()
#open打开文件是依赖了操作系统的提供的途径
#操作系统有自己的编码,open在打开文件的时候默认使用操作系统的编码
#win7\8--->gbk    mac/linux---->utf-8

 

#这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
f=open('a.txt','r',encoding='utf-8')
文件的打开模式
文件句柄 = open('文件路径', '模式') 

 

打开文件
#打开文件
# f = open('歌词','r',encoding='utf-8')
f = open('歌词',encoding='utf-8')

 

模式
#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】

#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb 
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

 

 

#"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
a+, 写读【可读,可写】
x, 只写模式【不可读;不存在则创建,存在则报错】
x+ ,写读【可读,可写】
xb

了解
了解1
由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n’,用U模式打开文件,就是支持所有的换行模式,也就说‘\r’ '\n' '\r\n'都可表示换行
t是windows平台特有的所谓text mode(文本模式),区别在于会自动识别windows平台的换行符。
了解2

 

f.writable()   #判断文件是否可写
f = open('1.歌词.txt','w',encoding="utf-8")
print(f.writable())  # #判断文件是否可写
f.close()  # True
f.readable()   #判断文件是否可读
f = open('1.歌词.txt','w',encoding="utf-8")
print(f.readable())  # #判断文件是否可写
f.close()  # False

 

 

读文件

1.read方法会一次性的读出文件中的所有内容

 

 

#1.读文件的第一种方式:read方法,用read方法会一次性的读出文件中的所有内容
f = open('1.歌词.txt',encoding='utf-8')
content = f.read()
print('read : ',content)  #
f.close()

 

输出结果

 

read :  111
222
aaa
bbb
哇哈哈
QQ星

 

2.读一部分内容:read(n),指定读n个单位

#2.读一部分内容:read(n),指定读n个单位
f = open('1.歌词.txt',encoding='utf-8')
print(f.read(2))  # 11
f.close()

 

3.按照行读,每次执行readline就会往下读一行

#3.读文件的第三种方式:按照行读,每次执行readline就会往下读一行
f = open('1.歌词.txt',encoding='utf-8')
content = f.readline()
print('readline : ',content.strip())    #strip去掉空格、制表符、换行符
content2 = f.readline()
print(content2.strip())
f.close()

输出结果

readline :  111
222

 

4.readlines,返回一个列表,将文件中的每一行作为列表中的每一项返回一个列表

 

#4.读文件的第四种方式:readlines,返回一个列表,将文件中的每一行作为列表中的每一项返回一个列表
f = open('1.歌词.txt',encoding='utf-8')
content = f.readlines()
print('readlines : ',content)  # readlines :  ['111\n', '222\n', 'aaa\n', 'bbb\n', '哇哈哈\n', 'QQ星']
f.close()

 

5.读:最常用for循环

#5.读:最常用for循环
f = open('1.歌词.txt',encoding='utf-8')
for l in f:
    print(l.strip())
f.close()

输出结果

111
222
aaa
bbb
哇哈哈
QQ星

列子:

 1.歌词.txt

结果:

 1.读文件并整理成需要的数据类型

f = open('1.歌词.txt',encoding='utf-8') #读文件并整理成需要的数据类型
goods_list = []
for line in f:
    if line.strip():
        goods_dic = {'name':None,'price':None}
        line = line.strip()
        goods_lst = line.split()
        print(goods_lst)
        goods_dic['name'] = goods_lst[0]
        goods_dic['price'] = goods_lst[1]
        goods_list.append(goods_dic)
print(goods_list)
f.close()

 

输出结果:

['apple', '10', '3']
['tesla', '1000000', '1']
['mac', '3000', '2']
['lenovo', '30000', '3']
['chicken', '10', '3']
['phone', '5000', '1']
['computer', '6000', '5']
['computer', '6000', '5']
['computer', '6000', '5']
['computer', '6000', '5']
['computer', '6000', '5']
[{'name': 'apple', 'price': '10'}, {'name': 'tesla', 'price': '1000000'}, {'name': 'mac', 'price': '3000'}, {'name': 'lenovo', 'price': '30000'}, {'name': 'chicken', 'price': '10'}, {'name': 'phone', 'price': '5000'}, {'name': 'computer', 'price': '6000'}, {'name': 'computer', 'price': '6000'}, {'name': 'computer', 'price': '6000'}, {'name': 'computer', 'price': '6000'}, {'name': 'computer', 'price': '6000'}]
结果:
2.只显示文件中有内容的行
f = open('1.歌词.txt',encoding='utf-8')    #只显示文件中有内容的行
goods_list = []
for line in f:
   if line.strip():
       print(line.strip())
f.close()

 

输出结果:

apple 10 3
tesla 1000000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
phone 5000 1
computer 6000 5
computer 6000 5
computer 6000 5
computer 6000 5
computer 6000 5
结果:

 

 

 

文件内的光标移动

一: read(3):

  1. 文件打开方式为文本模式时,代表读取3个字符

  2. 文件打开方式为b模式时,代表读取3个字节

二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate

注意:

  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

1.offset -- 这是在文件中,读/写指针的位置。
2.whence -- 这是可选的,默认为0,这意味着绝对的文件定位,其它的值是1,这意味着寻求相对于当前位置,2表示相对于文件的末尾。
seek参数详解

  2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

 

#tell: 告诉你当前光标所在的位置
f = open('1.歌词.txt','r+',encoding='utf-8')
content = f.readline()
print(content.strip())  # aabbccdd\n    (第一行)
#tell告诉你当前光标所在的位置
print(f.tell())  # 10
f.close()
# aabbccdd\n    (第一行)
# 01234567   '\n'==2个字节   ---》9
# (光标在此处)tesla 1000000 1      (光标第二行是前面)
tell

 

#seek 光标移动到第几个字节的位置
  # f.seek(0) 移动到最开始
  # f.seek(0,2) 移动到最末尾


#truncate: 保留n个字节
  ps:
  
aabbccdd
tesla 1000000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
phone 5000 1
computer 6000 5
computer 6000 5
computer 6000 5
computer 6000 5
computer 6000 5
1.txt

从文件开始的位置只保留指定字节的内容
f = open('1.歌词.txt','r+',encoding='utf-8')
f.truncate(3)  #从文件开始的位置只保留指定字节的内容
content2 = f.readline()
print(content2.strip())  # aab
f.close()

 查看1.txt文件,已被修改,只有aab3个字节了。

 

文件的修改

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    data=read_f.read() #全部读入内存,如果文件很大,会很卡
    data=data.replace('alex','SB') #在内存中完成修改

    write_f.write(data) #一次性写入新文件

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    for line in read_f:
        line=line.replace('alex','SB')
        write_f.write(line)

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 

 

 

 

 

 


                        
                        
                         
推荐阅读
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
author-avatar
厦禾Tony_303
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有