【Python编程】九、Python文件操作

简介: 【Python编程】九、Python文件操作

open(pathname) 打开文件

模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
  • 如果要打开的文件和当前py文件在同一目录,那么使用相对路径即可,否则使用绝对路径。
  • 如果不指定编码方式,默认使用操作系统当前的编码,而不是使用python3的默认编码utf-8。比如Windows下默认gbk编码,而python3默认utf-8,如果不指定编码方式打开文件,读文件时解码报错。操作磁盘数据的时候一定要注意编码方式,编码和解码使用同一种方式才不会报错。
f = open(‘txt’, encoding=’utf-8’)
data = f.read()
print(data)
f.close()
  • 文件操作完之后要关闭,因为打开文件就相当于把文件内容从磁盘加载到内存中,如果不关闭,内存就会一直被占用。
  • 打开文件的权限 r w a 如果不指定默认读权限打开文件

  • readlines() 可以打印出换行符,以列表形式读出所有行。
  • 在读文件的时候,会有一个指针指向读到的位置,使用f.read()相当于全部读完了,指针直接移到了文件末尾,再读文件就读不到内容了。
  • 如果仅以w写模式打开文件,如果文件不存在则新建文件并打开;如果文件存在,则清空文件并打开。 — 得到的都是一个空文件。
  • 如果写文件时需要换行,应手动添加 \n;
f.write() # 字符串形式写
f.writelines() # 列表的形式写
  • 在文件中,所有内容都是字符的形式(都是字符串),所以不管读还是写,都只能读出或写入字符串,不能写入数字类型int。
  • ‘a’模式 – 追加写的方式打开文件(可读可写)
    在文件末尾写入数据,正常情况下我们以w模式打开文件,指针是指在文件开始的位置,当我们写入数据的时候就把原来文件头部数据覆盖了,而a模式打开可以在文件末尾追加。这里要注意,在文件最后的位置写而不代表在文件最后一行写入。
  • ‘x’模式: 只写模式打开,不存在则创建,存在则报错
  • 注意:文件没有修改这一概念,只有覆盖,磁盘上的文件是无法修改的,我们说的修改是指用新的数据覆盖原来的数据。实际上,我们打开一个文件,操作系统会把文件加载到内存中,我们在内存中是可以修改文件内容的,修改完当我们保存到磁盘的时候,操作系统会用修改后的文件内容去覆盖掉磁盘上原来的文件。我们在Linux中会有一个.swap交换文件,修改的文件实际上就是新建了个.swap文件,当保存文件的时候会用.swap文件覆盖原来的文件。我们使用vim打开文件,实际上就是把文件加载到内存中去修改,当文件较大的时候,打开的会非常慢,而cat查看文件不同,它不会加载到内存,所以查看的速度很快。
  • with

二进制打开文件

  • rb wb – 以二进制的方式打开文件,只是以二进制方式处理文件,而不是说把文件改成二进制,在Linux中没有影响,因为Linux中默认文件处理就是二进制方式。
  • 以二进制方式打开文件的时候,就不能指定编码了,因为本身编码解码方式就是把字符解释成二进制的方式,既然以二进制操作文件,就没有所谓的编码解码了。
  • 通过rb读文件时,读出的都是二进制,中文字符都变成了十六进制表示的编码,如果我们要看字符原来的样子,我们可以使用.decode()方法进行解码,得到字符,这里需要指定解码方式,解码方式必须和磁盘文件保存的编码方式一致。
f = open(‘txt’, ‘rb’)
data = f.read()
print(data.decode(‘utf-8’))
  • 通过’wb’写文件,不能直接写字符串,应该写入二进制,而字符串要想变成二进制必须要经过编码,所以在写数据时要指定编码方式,以二进制的形式写入文件。
f = open(‘txt’, ‘wb’)
f.write(bytes(‘hello’, encoding=’utf-8’))
f.write(‘world’.encode(‘utf-8’))
  • 为什么要用b的方式打开呢,一是因为open方法打开文件时还有个默认参数是t,也就是以文本的方式打开文件text,而很多其他类型的文件比如图片视频音频,使用t的方式是处理不了的;二是因为二进制是可以跨平台的,因为不管Windows还是Linux/Unix,所有文件最终都是二进制形式存储的,所以二进制是可以跨平台的。(Linux下默认就是二进制)

回车换行符

  • Windows下回车换行是 \r\n 两个字符,通过open的b方式打开,通过read方法就可以读出来。或者不通过b方式打开,在open中加一个newline=’’也可以显示出 \r 字符,否则默认是看不到 \r 的,只能看到 \n。这是因为,我们的文件可能来自Linux、Windows等不同平台,不同平台的回车换行符是不一样的,python会统一把回车换行转换成 \n。newline=’’就表示告诉python,不要帮我转换,就按照原来的样子帮我打开。Linux下回车换行是 \n 一个字符。
#以下在都是Windows平台,Linux平台回车换行本来就是\n
#看不到\r只能看到\n
f = open(‘txt’, ‘r’, encoding=‘utf-8’)
print(f.readlines())
#可以看到\r\n
f = open(‘txt’, ‘rb’)
print(f.read ())
f = open(‘txt’, ‘r’, encoding=‘utf-8’, newline=’’)
print(f.readlines())

文件操作

  • .flush() 把内存中的数据刷新到磁盘
  • .tell() 当前读写的位置,读写位置指针、光标的位置,按字节计算
  • .seek() 移动读写位置,按字节的方式移动,默认从文件头开始算
    只要不是read方法,其他方法对读写位置(光标)的移动都是以字节为单位,read是以字符的方式移动。
f.seek(2) #光标向下移动2个字节
f.read(2) #读取两个字符(’你好’是两个字符,utf-8编码时占6字节)
f.seek(20)  
print(f.tell()) #– f.tell() = 20
f.seek(3)
print(f.tell()) #– f.tell() = 3,注意是3而不是23
#seek移动的字节数默认从文件头开始算
  • seek有三种模式
seek(num,0) # 默认方式,绝对位置,相对于文件头移动num字节
seek(num,1) # 相对位置,相对于上一次光标位置移动num字节
seek(-num,2) # 从文件尾部移动,从文件尾部往前移动num字节(要注意回车换行符\r\n),实际上就是倒着移动

需求:查看日志文件的最近一条记录(最后一行)

f = open(‘log’, ‘rb’)
data = f.readlines()
print(data[-1].decode(‘utf-8’)) 
#把整个文件读成列表放入内存 – 耗用内存,效率低
f = open(‘log’, ‘rb’)
#如何循环文件
# for i in f.readlines() #按行的方式把整个文件读到内存
for i in f: #一次取一行,需要的时候才去取
  offs = -10
  while True:
    f.seek(offs, 2)
    data = f.readlines()
    if len(data) > 1: #列表长度大于1说明包含换行符,读多了
        print(‘文件最后一行是%s’ %(data[-1].decode(‘utf-8’)))
        break
    offs *= 2
  • 使用seek方法1、2的方式移动光标,必须要以二进制b的方式open打开文件,否则报错。
  • .truncate() 截断,是一种写文件操作
f = open(‘txt’, ‘r+’, encoding=‘utf-8’, newline=’’)
#可以通过r+, a+等等方式打开,只要保证有写权限即可
#不能通过w或w+方式打开,因为w会把原文件清空,得到的是空文件
#截断是一种写操作,把原文件截断为指定字节数,截断空文件没有意义
f.truncate(10) #截取10字节


相关文章
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
30天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
18天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
102 80
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
151 59
|
7天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
29 14
|
17天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
53 2
|
30天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
48 10
|
1月前
|
机器学习/深度学习 人工智能 Java
Python 语言:强大、灵活与高效的编程之选
本文全面介绍了 Python 编程语言,涵盖其历史、特点、应用领域及核心概念。从 1989 年由 Guido van Rossum 创立至今,Python 凭借简洁的语法和强大的功能,成为数据科学、AI、Web 开发等领域的首选语言。文章还详细探讨了 Python 的语法基础、数据结构、面向对象编程等内容,旨在帮助读者深入了解并有效利用 Python 进行编程。
|
1月前
|
机器学习/深度学习 人工智能 数据挖掘
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
45 12
|
1月前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!