热门标签 | 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') 

 

 

 

 

 


                        
                        
                         
推荐阅读
  • Python内置模块详解:正则表达式re模块的应用与解析
    正则表达式是一种强大的文本处理工具,通过特定的字符序列来定义搜索模式。本文详细介绍了Python内置的`re`模块,探讨了其在字符串匹配、验证和提取中的应用。例如,可以通过正则表达式验证电子邮件地址、电话号码、QQ号、密码、URL和IP地址等。此外,文章还深入解析了`re`模块的各种函数和方法,提供了丰富的示例代码,帮助读者更好地理解和使用这一工具。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
  • 本文详细介绍了 Python 中字符串处理的各种技巧,包括查找、复制、替换、删除、截取、连接、比较、包含检测及大小写转换等操作。特别强调了如何使用 `strip()`、`lstrip()` 和 `rstrip()` 方法去除字符串中的空格和特殊符号,以及如何通过简单的赋值语句实现字符串的复制。此外,还提供了丰富的示例代码,帮助读者更好地理解和应用这些技巧。 ... [详细]
  • 本课程深入探讨了 Python 中自定义序列类的实现方法,涵盖从基础概念到高级技巧的全面解析。通过实例演示,学员将掌握如何创建支持切片操作的自定义序列对象,并了解 `bisect` 模块在序列处理中的应用。适合希望提升 Python 编程技能的中高级开发者。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 字节码开发笔记:深入解析与应用技巧 ... [详细]
author-avatar
Json
技术QQ交流群:294088839.
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有