找回密码
 会员注册
查看: 30|回复: 0

python读写文件之open和withopen()详细解析

[复制链接]

7

主题

0

回帖

22

积分

新手上路

积分
22
发表于 2024-9-9 21:10:24 | 显示全部楼层 |阅读模式
python读写文件之open和withopen()详细解析文章目录python读写文件之open和withopen()详细解析1.open()和withopen()能打开不同的文件类型吗?2.文本文件和二进制文件的区别2.1文本文件(TextFiles)2.2二进制文件(BinaryFiles)区别3.读文件3.1使用open()和close()3.2使用withopen()4.写文件4.1字符编码4.3文件对象的属性5.需要注意的点当我们讨论文件操作时,通常会涉及到open()和close()这两个函数。在Python中,open()函数用于打开一个文件,并返回一个文件对象,而close()函数用于关闭之前打开的文件。然而,在实际编程中,使用withopen()语句是一种更安全、更简洁的方式来处理文件操作。下面将详细介绍这些概念。1.open()和withopen()能打开不同的文件类型吗?open()和withopen()在Python中都能用来打开各种类型的文件,包括文本文件和二进制文件。它们之间的主要区别在于文件处理的方式和资源管理上,而不是它们能够打开的文件类型。不论使用open()还是withopen(),你都可以打开以下类型的文件:文本文件:使用‘r’(读取模式)、‘w’(写入模式)、‘a’(附加模式)等文本模式来打开文件。二进制文件:使用‘rb’(读取二进制模式)、‘wb’(写入二进制模式)、‘ab’(附加二进制模式)等二进制模式来打开文件。2.文本文件和二进制文件的区别2.1文本文件(TextFiles)文本文件是由一系列可打印的字符(如字母、数字、标点符号等)组成,这些字符按照某种编码标准(如ASCII、UTF-8等)表示。文本文件的主要特点包括:可读性:它们可以直接由人阅读和理解。通用性:大多数文本编辑器和处理器都能够打开和编辑文本文件。简单性:文本文件通常不包含复杂的格式化信息,如字体样式、颜色等。编码:文本文件需要使用一种字符编码方案来表示字符。常见的编码方案包括ASCII、UTF-8、UTF-16等。文本文件的例子包括纯文本文件(.txt)、源代码文件(如.py、.java)、HTML文件(.html)、Markdown文件(.md)等。2.2二进制文件(BinaryFiles)非文本文件或二进制文件包含了不仅仅是可打印字符的信息,还包括了无法直接显示或解释的字节序列。这类文件的特点包括:不可读性:通常情况下,它们不能直接被人类阅读或理解,除非使用特定的工具或应用程序。复杂性:非文本文件可能包含复杂的格式化信息、图形数据、音频数据等。专用性:每种类型的非文本文件通常都需要相应的软件来打开和处理。格式:非文本文件通常具有特定的文件格式,如图像文件(.jpg、.png)、音频文件(.mp3、.wav)、视频文件(.mp4、.avi)以及文档文件(.docx、.pdf)等。区别处理方式:文本文件通常使用字符编码来表示内容,而二进制文件则是以字节序列的形式存储数据。编辑工具:文本文件可以用文本编辑器打开,而二进制文件需要特定的应用程序来解析和展示其内容。存储效率:对于大量数据,二进制文件通常比文本文件更节省空间,因为文本文件需要额外的字符编码开销。兼容性:文本文件更容易在不同的系统和平台上进行交换,而二进制文件可能由于平台差异导致兼容性问题。3.读文件3.1使用open()和close()使用Python内置的open()函数,传入文件名和标示符:>>>f=open(r'F:\jupyternotebookfiles\textfiles.txt','r')#标示符'r'表示读1如果文件不存在,open()函数就会抛出一个错误,并且给出错误码和详细的信息告诉你文件不存在:>>>f=open(r'F:\jupyternotebookfiles\text.txt','r')Traceback(mostrecentcalllast):File"",line1,inFileNotFoundError:[Errno2]Nosuchfileordirectory:'F:\\jupyternotebookfiles\\text.txt'1234调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示:>>>contents=f.read()>>>print(contents)narutobleachonepiece12345最后需要调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:>>>f.close()1由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。为了保证无论是否出错都能正确地关闭文件,我们可以使用try…finally来实现:try:f=open(r'F:\jupyternotebookfiles\textfiles.txt','r')contents=f.read()print(contents)finally:iff:f.close()1234567输出如下:narutobleachonepiece1233.2使用withopen()每次都写close()比较繁琐,Python引入with语句,这样能够确保最后文件一定被关闭,且不用手动再调用close方法,效果和前面的try…finally是一样的。注意:1、调用read()会一次性读取文件的全部内容withopen(r'F:\jupyternotebookfiles\textfiles.txt','r')asf:contents=f.read()print(contents)123输出如下:narutobleachonepiece1232、调用readline()可以每次读取一行内容withopen(r'F:\jupyternotebookfiles\textfiles.txt','r')asf:a=f.readline()print(a)b=f.readline()print(b)c=f.readline()print(c)123456789输出如下:narutobleachonepiece123453、调用readlines()一次读取所有内容并按行返回listwithopen(r'F:\jupyternotebookfiles\textfiles.txt','r')asf:a=f.readlines()print(a)123输出入下:['naruto\n','bleach\n','onepiece']14.写文件调用open()函数时,传入标识符’w’或者’wb’表示写文本文件或写二进制文件:withopen(r'F:\jupyternotebookfiles\textfiles.txt','w')asf:a=f.write('attackontitan\n')12要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码。4.1字符编码要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:withopen(r'F:\jupyternotebookfiles\gbk.txt','r',encoding='gbk')asf:a=f.read()print(a)123输出如下:gbk文本1遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:withopen(r'F:\jupyternotebookfiles\gbk.txt','r',encoding='gbk',errors='ignore')asf:#注意errors='ignore'a=f.read()print(a)1234.2读写方式列表模式描述r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。r+打开一个文件用于读写。文件指针将会放在文件的开头。rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。4.3文件对象的属性属性描述file.read([size])将文件数据作为字符串返回,可选参数size控制读取的字节数file.readlines([size])返回文件中行内容的列表,size参数可选file.write(str)将字符串写入文件file.writelines(strings)将字符串序列写入文件file.close()关闭文件file.closed表示文件已经被关闭,否则为Falsefile.modeAccess文件打开时使用的访问模式file.encoding文件所使用的编码file.name文件名file.newlines未读取到行分隔符时为None,只有一种行分隔符时为一个字符串,当文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束的列表file.softspace为0表示在输出一数据后,要加上一个空格符,1表示不加。这个属性一般程序员用不着,由程序内部使用5.需要注意的点要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数。读取时调用read()将一次性读取文件的全部内容,如果文件有10GB,内存就爆了,保险起见可以反复调用read(size)方法,每次最多读取size个字节的内容。调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。根据需要调用:如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()更方便。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-9 05:58 , Processed in 1.448838 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表