当前位置 主页 > 网站技术 > 代码类 >

    给Python学习者的文件读写指南(含基础与进阶)

    栏目:代码类 时间:2020-01-30 06:09

    对于初学者来说,一份详尽又清晰明白的指南很重要。今天,猫猫跟大家一起,好好学习Python文件读写的内容,这部分内容特别常用,掌握后对工作和实战都大有益处。学习是循序渐进的过程,欲速则不达。文章较长,建议大家收藏,以备复习查阅哦。

    1、如何将列表数据写入文件?
    2、如何从文件中读取内容?
    3、多样需求的读写任务
    4、从with语句到上下文管理器

    如何将列表数据写入文件?

    首先,我们来看看下面这段代码,并思考:这段代码有没有问题,如果有问题的话,要怎么改?

    li = ['python',' is',' a',' cat']
    with open('test.txt','w') as f:
      f.write(li)

    现在公布答案,这段代码会报错:

    TypeError  Traceback (most recent call last)
    <ipython-input-6-57e0c2f5a453> in <module>()
          1 with open('test.txt','w') as f:
    ----> 2     f.write(li)

    TypeError: write() argument must be str, not list

    以上代码的想法是将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',' is',' a',' 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',' is',' a',' cat'])
      ...:   f.writelines('python is a cat')
      ...:   f.write('python is a cat')
    
    # 以下2种写法等价,都是写入列表的字符串版本“['python',' is',' a',' cat']”
    In [21]: with open('test.txt','w') as f:
      ...:   f.write(str(['python',' is',' a',' cat']))
      ...:   f.writelines(str(['python',' is',' a',' cat']))
    
    # 作为反例,以下写法都是错误的:
    In [22]: with open('test.txt','w') as f:
      ...:   f.writelines([2018,'is','a','cat']) # 含非字符串
      ...:   f.write(['python','is','a','cat']) # 非字符串

    由上可知,当多段分散的字符串存在于列表中的时候,要用writelines()方法,如果字符串是一整段,那直接使用write()方法。如果要以整个列表的形式写入文件,就使用str()方法做下转化。

    这个问题还没结束,如果列表中就是有元素不是字符串,而且要把全部元素取出来,怎么办呢?

    那就不能直接使用write()和writelines()了,需要先用for循环,把每个元素取出来,逐一str()处理。

    In [37]: content=[1,' is',' 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”).