IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python3 文件读写 -> 正文阅读

[Python知识库]Python3 文件读写

文件

打开文件

要读取文件,就得先打开一个文件,可以使用Python内置的open()函数来打开一个文件,open(<文件名>,<打开模式>)

f = open('test.txt',r)

上面是一个最简单的打开文件的例子,其中在传入文件名时需要将文件所在的绝对路径写上,如果不写则默认会在当前运行Python环境的目录下去寻找该文件,如果文件不在此处,那程序将会报错。

上面说到如果文件不存在,程序将报错,这个错误正是open()函数抛出的一个IOError异常,该异常会给出错误码和详细的信息告诉你该文件不存在。

>>> f = open(r"C:/Users/python/text.txt")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'C:/Users/python/text.txt'

由于读写文件经常会出现IOError,但为了保证无论是否出错都能正常关闭文件,我们可以使用try...except...finally来解决此问题:

try:
    f = open('/path/to/file', 'r')
    print(f.read())
except IOError as e:
    print("IOError:",e) 
finally:
    if f:
        f.close()

以上程序,如果文件读写出现IOError,会被except捕获,并打印相关信息,同时,由于finally语句块内语句一定会执行,因此只要符合条件,文件就会被关闭。

文件打开模式
文件的打开模式描述
‘r’只读模式,默认值,如果文件不存在,返回FileNotFoundError
‘w’覆盖写模式,文件不存在则创建,存在则完全覆盖
‘x’创建写模式,文件不存在则创建,存在则返回FileExistsError
‘a’追加写模式,文件不存在则创建,存在则在文件最后追加内容
‘b’二进制文件模式
‘t’文本文件模式,默认值
‘+’与r/w/x/a一同使用,在原功能基础上增加同时读写功能
文件内容读取

如果文件打开成功,接下来可以文件了

>>> f.read()
"Python is good!"
操作方法描述
f.read(size = -1)读入全部内容,如果给出参数,读入前size长度
>>> s = f.read(2)
f.readline(size = -1)读入一行内容,如果给参数,读入该行前size长度
>>>s = f.readline()
f.readlines(hint=-1)读入文件所有行,以每行为元素形成列表,如果给出参数,读入前hint行
文件的全文本操作
# 遍历全文本:方法一	
fname = input("请输入要打开的文件名称:")			# 文件路径也要一起输入
fo = open(fname,'r')
txt = fo.read()
# 对全文txt进行处理的代码
fo.close()
# 方法二:按数量读入,逐步处理(适合处理大文件)
fname = input("请输入要开打的文件名称:")			# 文件路径也要一起输入
fo = open(fname,'r')
txt = fo.read(2)								# 读入文件的前2长度
while txt != "":								# 如果txt不为空则继续读入
    # 对txt进行处理
    txt = fo.read(2)
fo.close()
文件的逐行操作
# 逐行遍历文件:方法一,一次读入,分行处理
fname = input("请输入要打开的文件名称:")			# 文件路径也要一起输入
fo = open(fname,'r')
for line in fo.readlines():
    print(line)
fo.close()
# 方法二:分行读入,逐行处理(适合处理大文件)
fname = input("请输入要打开的文件名称:")			# 文件路径也要一起输入
fo = open(fname,'r')
for line in fo:
    print(line)
fo.close()
二进制文件读取
>>> f = open(r'test.png','rb')
>>> f.read()
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\  # 十六进制表示的字节
字符编码文件读取

有些时候未必所有文本文件都是UTF-8编码的,这种情况需要给open()函数传入encoding参数,例如读取GBK编码的文件:

>>> f = open(r'test_gbk.txt', 'r', encoding='gbk')
>>> f.read()
'你好'

特殊的,有些文本文件中可能夹杂了一些非法的编码字符,这样会使得程序遇到UnicodeDecodeError,此时open()函数还可以接收一个error参数,表示如果遇到编码错误后如何处理。而最简单的方式就是忽略该错误:

>>> f = open(r'test_gbk.txt', 'r', encoding='gbk',error='ignore')
文件的写入
操作方法描述
f.writes(s)向文件写入一个字符串或字节流
>>>f.writes(“中国是一个伟大的国家”)
f.writelines(lines)将一个元素全为字符串的列表写入文件(将各个元素直接拼接然后写入文件)
>>>ls = [“中国”,“法国”,“美国”]
>>>f.writelines(ls)
中国法国美国
f.seek(offset)改变当前文件操作指针的位置,offset含义如下:0-文件开头;1-当前位置;2-文件结尾
>>>f.seek(0) #回到文件开头
fo = open(r"output.txt,''w+")
ls = ["中国","法国","美国"]
fo.writelines(ls)
for line in fo:
    print(line)
fo.close()

# 以上的程序是不会有输出的,因为在写入完成后,指针处于文件结尾,此时进行打印就会没有内容
# 想要有输出需要让指针回到文件开头,如下

fo = open(r"output.txt,''w+")
ls = ["中国","法国","美国"]
fo.writelines(ls)
fo.seek(0)
for line in fo:
    print(line)
fo.close()
# 输出:中国法国美国

这里需要注意的是,不论是读取文件还是写入文件我们都在程序的最后使用了close()函数,该函数是用来关闭文件的,由于操作文件始终还是通过操作系统提供的接口来对文件对象进行读写,所以在文件使用完毕后需要关闭文件,以免占用操作系统资源。 甚至如果在写入文件时,没有关闭文件,那么文件是不会有任何修改的。

使用with

在上面讲到,读写文件后需要使用close()函数关闭文件释放资源,但很多时候,人们往往会忘记这最后一步的操作;而with写法的出现,则使得这一步骤的省略,且实现对文件的读写更加简便。

with open(r'test.txt','r') as f:
    print(f.read())

读取大文件

通过前文,我们知道读取文件时可以用read()或者readlines()来读取,但这些都是一次性地读入,在文件不是很大的时候,这样做确实能够保证速度,但如果遇到大文件,这种方法就不可取了。Python中有一个fileinput的模块,可以用它来操作大文件。

from fileinput
>>> for line in fileinput.input(r"hamlet.txt"):
...  print(line,end="")
...

Tips

可以观察到在上文的文件路径输入时,路径前都会有个r,这个的作用是为了使程序不将路径字符串进行转义。这样当路径中出现特殊字符时,就不会被转义,而是以原始字符串常量去处理该路径字符串。这种做法常见于正则表达式于系统路径这两方面。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-15 16:07:41  更:2021-07-15 16:09:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 7:25:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码