给Python学习者的文件读写指南(含基础与进阶)
|
对于初学者来说,一份详尽又清晰明白的指南很重要。今天,猫猫跟大家一起,好好学习Python文件读写的内容,这部分内容特别常用,掌握后对工作和实战都大有益处。学习是循序渐进的过程,欲速则不达。文章较长,建议大家收藏,以备复习查阅哦。 1、如何将列表数据写入文件? 如何将列表数据写入文件? 首先,我们来看看下面这段代码,并思考:这段代码有没有问题,如果有问题的话,要怎么改?
li = ['python',' is',' a',' cat']
with open('test.txt','w') as f:
f.write(li)
现在公布答案,这段代码会报错:
以上代码的想法是将list列表内容写入txt文件中,但是报错 TypeError: write() argument must be str。就是说,write()方法必须接受字符串(str)类型的参数。 Python中内置了str()方法,可以返回字符串版本的对象(Return a string version of object)。所以,上面的例子中,我们试试把 f.write(li) 改为 f.write(str(li)) ,先做一下字符串类型的转化看看。代码略。 这次没有报错了,但是打开文件就傻眼了吧,写入的内容是“['python',' cat']”。怎么才能写成“python is a cat”呢? 文件写操作还有一个writelines()方法,它接收的参数是由字符串组成的序列(sequence),实际写入的效果是将全部字符串拼接在一起。字符串本身也是一种序列,所以当参数是字符串的时候,writelines()方法等价于write()。
# 以下3种写法等价,都是写入字符串“python is a cat”
In [20]: with open('test.txt','w') as f:
...: f.writelines(['python',' cat'])
...: f.writelines('python is a cat')
...: f.write('python is a cat')
# 以下2种写法等价,都是写入列表的字符串版本“['python',' cat']”
In [21]: with open('test.txt','w') as f:
...: f.write(str(['python',' cat']))
...: f.writelines(str(['python',' cat']))
# 作为反例,以下写法都是错误的:
In [22]: with open('test.txt','w') as f:
...: f.writelines([2018,'is','a','cat']) # 含非字符串
...: f.write(['python','cat']) # 非字符串
由上可知,当多段分散的字符串存在于列表中的时候,要用writelines()方法,如果字符串是一整段,那直接使用write()方法。如果要以整个列表的形式写入文件,就使用str()方法做下转化。 这个问题还没结束,如果列表中就是有元素不是字符串,而且要把全部元素取出来,怎么办呢? 那就不能直接使用write()和writelines()了,需要先用for循环,把每个元素取出来,逐一str()处理。
In [37]: content=[1,' everything']
In [38]: with open('test.txt','w') as f:
...: for i in content:
...: f.write(str(i))
需要注意的是,writelines()不会自动换行。如果要实现列表元素间的换行,一个办法是在每个元素后面加上换行符“n”,如果不想改变元素,最好是用for循环,在写入的时候加在末尾:for i in content: f.writelines(str(i)+“n”). 引申一下,经过实验,数字及元祖类型也可以作为write()的参数,不需转化。但是dict字典类型不可以,需要先用str()处理一下。字典类型比较特殊,最好是用json.dump()方法写到文件,具体操作方法以及注意事项,请看喵喵之前发的《假期玩得开心也不忘充电,学习Python操作JSON,网络数据交换不用愁》. 总结一下,write()接收字符串参数,适用于一次性将全部内容写入文件;writelines()接收参数是由字符串组成的序列,适用于将列表内容逐行写入文件。str()返回Python对象的字符串版本,使用需注意。 如何从文件中读取内容? 从文件中读取内容有如下方法:
简而言之,在不传参数的情况下,read()对应write(),读取全部内容;readlines()对应writelines(),读取全部内容(含换行符)并以列表形式返回,每个换行的内容作为列表的一个元素。
但是,以上两个方法有个缺点,当文件过大的时候,一次性读取太多内容,会对内存造成极大压力。读操作还有一个readline()方法,可以逐行读取。
readline()读取第一行就返回,再次调用f.readline(),会读取下一行。 喵喵,是否感觉跟《超强汇总:学习Python列表,只需这篇文章就够了》学习过的生成器很像,需要不停调用next()获取下一行。 这么看来,readline()太笨拙了。那么,有什么办法可以优雅地读取文件内容呢? 回过头来看readlines()方法,它返回的是一个列表。这不奇怪么,好端端的内容为啥要返回成列表呢? 再想想writelines()方法,把字符串列表写入文件正是这家伙干的事,readlines()方法恰恰是它的逆操作!而writelines()方法要配合for循环,所以我们把readlines()与for循环结合,看看会怎样。
In [61]: with open('test.txt','r') as f:
...: for line in f.readlines():
...: print(line)
1 is everything.
python is a cat.
this is the end.
# 读取内容包含换行符,所以要strip()去掉换行符
In [62]: with open('test.txt','r') as f:
...: for line in f.readlines():
...: print(line.strip())
1 is everything.
python is a cat.
this is the end.
总结一下,readline()比较鸡肋,不咋用;read()适合读取内容较少的情况,或者是需要一次性处理全部内容的情况;而readlines()用的较多,比较灵活,因为for循环是一种迭代器,每次加载部分内容,既减少内存压力,又方便逐行对数据处理。 多样需求的读写任务 前两部分讲了文件读写的几大核心方法,它们能够起作用的前提就是,需要先打开一个文件对象,因为只有在文件操作符的基础上才可以进行读或者写的操作。 打开文件用的是open()方法,所以我们再继续讲讲这个方法。open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
open()方法的参数里file(文件)是必需的,其它参数最常用的是mode(模式)和encoding(编码)。 先说说encoding,一般来说,打开文件的编码方式以操作系统的默认编码为准,中文可能会出现乱码,需要加encoding='utf-8'。
In [63]: with open('test.txt','r') as f:
...: for line in f.readlines():
...: print(line.strip())
-----------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-63-731a4f9cf707> in <module>()
1 with open('test.txt','r') as f:
----> 2 for line in f.readlines():
3 print(line.strip())
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa4 in position 26: illegal multibyte sequence
In [65]: with open('test.txt','r',encoding='utf-8') as f:
...: for line in f.readlines():
...: print(line.strip())
爱猫猫
python is a cat.
再说mode,它指定文件打开的模式。
喵喵,初看起来,模式很多,但是,它们只是相互组合罢了。建议记住最基本的w、r、a,遇到特殊场景,再翻看一下就好了。 从with语句到上下文管理器 基础部分讲完了,下面是进阶部分。知其然,更要知其所以然。 1、with语句是初学者必会常识 首先,要解释一下为啥前文直接就用了with语句。with语句是读写文件时的优雅写法,这已经默认是Python初学者必会的常识了。如果你还不会,先看看用和不用with语句的对比:
# 不用with语句的正确写法
try:
f = open('test.txt','w')
f.writelines(['python',' cat'])
finally:
if f:
f.close()
# 使用with语句的正确写法
with open('test.txt','w') as f:
f.writelines(['python',' cat'])
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
