当前位置: 首页 > 后端技术 > Python

一篇文章搞定Python读取文件的全部知识

时间:2023-03-25 22:11:43 Python

文件无处不在,无论我们使用哪种编程语言,处理文件对于每个程序员来说都是必不可少的写入数据和从中读取数据的过程,Python拥有丰富的处理不同文件类型的包,让我们更轻松方便的完成文件处理的工作阅读模式读取文本文件读取CSV文件读取JSON文件Let'sgo!打开文件在访问文件内容之前,我们需要打开文件。Python提供了一个内置函数,可以帮助我们以不同的模式打开文件。open()函数接受两个基本参数:文件名和模式。默认模式是“r”,它以只读方式打开文件。这些模式定义了我们如何访问文件以及我们如何操作它们的内容。open()函数提供了几种不同的模式,我们稍后会一一讨论。让我们稍后通过“Python之禅”文件进行讨论和学习f=open('zen_of_python.txt','r')print(f.read())f.close()好于丑陋。显式好于隐式。简单好于复杂。复杂好于复杂。扁平好于嵌套。稀疏好于密集。可读性很重要....在上面的代码中,open()函数以只读模式打开文本文件,这允许我们在不更改文件的情况下从文件中获取信息。在第一行中,open()函数的输出被分配给代表文本文件的对象f,在第二行中,我们使用read()方法读取整个文件并打印其内容,而close()方法在最后一行关闭文件。重要的是要注意,我们必须始终在完成处理后关闭打开的文件,以释放我们的计算机资源并避免抛出异常open('zen_of_python.txt')asf的异常也是如此:print(f.read())输出:TimPeters的TheZenofPython美丽胜于丑陋。明确胜于隐含。简单胜于复杂。复杂胜于复杂。平坦胜于嵌套。稀疏胜于密集。可读性很重要....上面的代码使用with语句创建上下文并绑定到变量f,通过该变量可以访问所有文件对象方法变量访问文件对象。read()方法在第二行读取整个文件,然后使用print()函数输出文件内容。当程序到达with语句块上下文的末尾时,关闭文件以释放资源,保证其他程序可以正常调用。通常我们在处理不再需要、需要立即关闭的对象时(比如文件、数据库、网络连接),强烈推荐使用with语句。这里需要注意的是,即使在退出withcontextmanager块后,我们也可以访问f变量,但是文件是关闭的。让我们尝试一些文件对象属性来查看变量是否仍然存在并且可以访问:print("Filenameis'{}'.".format(f.name))iff.closed:print("Fileisclosed.")else:print("Fileisn'tclosed.")输出:文件名为'zen_of_python.txt'。文件已关闭。但此时无法读取文件或写入文件。关闭文件时,任何访问其内容的尝试都会导致以下错误:f.read()Output:-----------------------------------------------------------------------ValueErrorTraceback(最近调用最后一次)~\AppData\Local\Temp/ipykernel_9828/3059900045.pyin---->1f.read()ValueError:I/Ooperationonclosedfile。Python中的文件读取模式就像我们之前看到的那样,我们需要在打开文件的时候指定模式。下表显示了Python中的不同文件模式:模式描述'r'打开一个只读文件'w'打开一个写文件。如果该文件存在,则将其覆盖,否则将创建一个新文件'a'打开一个仅用于追加的文件。如果该文件不存在,将创建文件'x'以创建一个新文件。Failiffileexists'+'打开文件进行更新我们还可以指定以文本模式“t”、默认模式或二进制模式“b”打开文件。让我们看看如何使用简单的语句复制图像文件dataquest_logo.png:withopen('dataquest_logo.png','rb')asrf:withopen('data_quest_logo_copy.png','wb')aswf:forb在rf:wf.write(b)上面的代码复制了Dataquest徽标图像并将其存储在相同的路径中。'rb'模式以二进制模式打开文件进行读取,而'wb'模式以文本模式打开文件以进行并行写入和读取。在Python中有几种读取文本文件的方法。检索文本文件内容的有用方法到目前为止,我们已经看到可以使用read()方法读取文件的全部内容。如果我们只想从文本文件中读取几个字节怎么办,我们可以在read()方法中指定字节数。让我们试一试:withopen('zen_of_python.txt')asf:print(f.read(17))输出:TheZenofPython上面的简单代码读取zen_of_python.txt文件的前17个字节并写入Sometimes一次读取一行文本文件的内容更有意义,在这种情况下,我们可以使用readline()方法withopen('zen_of_python.txt')asf:print(f.readline())Output:TheZenofPython,byTimPeters上面的代码返回文件的第一行,如果我们再次调用该方法,它将返回文件中的第二行等。像这样:withopen('zen_of_python.txt')asf:print(f.readline())print(f.readline())print(f.readline())print(f.readline())输出:Python之禅,作者:TimPeters美丽胜于丑陋。明确比隐式好。这个有用的方法可以帮助我们以增量方式读取整个文件。以下代码通过逐行迭代输出整个文件,直到跟踪我们正在读取或写入文件的位置的文件指针到达文件末尾。当readline()方法到达文件末尾时,它返回一个空字符withopen('zen_of_python.txt')asf:line=f.readline()whileline:print(line,end='')=line=.readline()输出:Python之禅,作者:TimPeters美丽胜于丑陋。明确胜于隐含。简单胜于复杂。复杂胜于复杂。平坦胜于嵌套。稀疏胜于密集。可读性计数。特殊情况不足以打破规则。尽管实用性胜过纯洁性。错误不应该悄悄过去。除非明确沉默。面对歧义,拒绝猜测的诱惑。应该有一个-最好只有一个一个——显而易见的方法。尽管这种方法一开始可能并不明显,除非你是荷兰人。现在总比没有好。虽然永远不会比*正确*现在更好。如果实施很难解释,那就是一个坏主意。如果实现很容易解释,那可能是个好主意。命名空间是一个好主意想出好主意——让我们做更多这样的事!上面的代码在while循环之外读取文件的第一行并将其分配给line变量。在while循环内,它打印存储在line变量中的字符串,然后读取文件的下一行。while循环迭代该过程,直到readline()方法返回一个空字符串。空字符串在while循环中的计算结果为False,因此迭代过程终止。读取文本文件的另一个有用方法是readlines()方法,当应用于文件对象时,它返回一个字符串列表,其中包含文件的每一行withopen('zen_of_python.txt')asf:lines=f.readlines()让我们检查lines变量的数据类型,然后打印它:print(type(lines))print(lines)Output:['TheZenofPython,byTimPeters\n','\n','Beaut...]是一个字符串列表,其中列表中的每一项都是文本文件的一行,`\n转文字字符代表文件中的一个新行。此外,我们可以通过索引或切片访问列表中的每个项目:print(lines)print(lines[3:5])print(lines[-1])输出:['TheZenofPython,byTimPeters\n','\n','美丽总比丑陋好。\n',...--让我们做更多这样的事情!"]['明确胜于含蓄。\n','简单胜于复杂。\n']命名空间是一个很棒的想法——让我们做更多这样的事情!阅读CSV文件到目前为止,我们已经学习了如何使用常规文本文件。但有时数据是CSV格式的,数据专业人员通常会检索所需的信息并操作CSV文件的内容接下来我们将使用CSV模块,它提供了有用的方法来读取存储在CSV文件中的逗号分隔值。现在让我们尝试importcsvwithopen('chocolate.csv')asf:reader=csv.reader(f,delimiter=',')forrowinreader:print(row)Output:['Company','BeanOriginor酒吧名称'、'REF'、'审查日期'、'可可百分比'、'公司位置'、'评级'、'咖啡豆类型'、'原产国']['A.Morin','AguaGrande','1876','2016','63%','France','3.75','?\xa0','SaoTome']['A.Morin','Kpime','1676','2015','70%','法国','2.75','?\xa0','多哥']['A.Morin','Atsane','1676','2015','70%','France','3','?\xa0','Togo']['A.'morin','Akata','1680','2015','70%','France','3.5','?\xa0','Togo']...CSV文件的每一行组成一个列表,其中每个项目都可以轻松访问,如下所示:importcsvwithopen('chocolate.csv')asf:reader=csv.reader(f,delimiter=',')forrowinreader:print("The{}companyislocatedin{}.".format(row[0],row[5]))输出:CompanycompanylocatedinCompanyLocation.A.Morin公司位于法国。A.Morin公司位于ed在法国。A.Morin公司在法国。A.Morin公司在法国。Acalli公司在美国。Acalli公司在美国。Adi公司在斐济。。。.很多时候专业人士用列名代替索引更方便在这种情况下,我们不使用reader()方法,而是使用DictReader()方法,它返回字典对象的集合importcsvwithopen('chocolate.csv')asf:dict_reader=csv.DictReader(f,delimiter=',')forrowindict_reader:print("The{}companylocatedin{}.".format(row['Company'],row['CompanyLocation']))Output:TheA.Morincompanyis位于法国。A.Morin公司位于法国。A.Morin公司位于法国。A.Morin公司位于法国。Acalli公司位于美国。Adi公司位于斐济....读取JSON文件我们主要用于存储和交换数据的另一种流行文件格式是JSON,JSON代表JavaScriptObjectNotation并允许我们使用逗号分隔的键值对接下来我们将加载一个JSON文件并将其用作JSON对象,而不是文本文件,为此我们需要导入JSON模块。然后在with上下文管理器中,我们使用了属于json对象的load()方法,它加载文件的内容并将其作为字典存储在上下文变量中。importjsonwithopen('movie.json')asf:content=json.load(f)print(content)Output:{'Title':'BicentennialMan','ReleaseDate':'Dec171999','MPAARating':'PG','RunningTimemin':132,'Distributor':'WaltDisneyPictures','Source':'BasedonBook/ShortStory','MajorGenre':'Drama','CreativeType':'ScienceFiction','Director':'ChrisColumbus','RottenTomatoesRating':38,'IMDBRating':6.4,'IMDBVotes':28827}让我们检查一下内容变量的数据类型:print(type(content))Output:它的数据类型是一个字典,所以我们可以很容易地从中提取数据print('{}directedby{}'.format(content['Title'],content['导演']))输出:ChrisColumbus导演的200周年纪念日总结今天我们讨论了Python中的文件处理,重点是读取文件的内容。我们了解了open()内置函数、with上下文管理器,以及如何读取文本、CSV和JSON等常见文件类型。以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能领取大量学习资料。或者去编程学习网了解更多编程技术知识。