zoukankan      html  css  js  c++  java
  • python教程(八)·文件操作

    由于离高考越来越近,博主打算本篇文章过后,暂停本系列教程的更新,等到高考完后再继续本系列教程,请谅解!

    这次我们学习用python操作文件,包括文件的读、写等……

    操作文件第一步——打开文件

    要想操作文件,我们首先应该打开一个文件。当然,这个“打开”不是用鼠标双击那种“打开”,别忘了这是个python编程的教程,所以我们是用python程序来打开文件。打开文件用open函数,函数的基本用法如下:

    obj = open(name[, mode]) # 中括号包围表示mode参数是默认参数的,即有默认值
    

    上面的name就是我们要打开的文件的路径,这个参数是必须的。参数mode是打开文件的模式,后面单独介绍。

    该函数返回一个文件对象,通过这个对象的一些方法,我们对文件进行一些操作。

    文件模式

    参数mode代表打开文件的模式,文件模式的常用取值有以下几种:

    含义
    'r' 读模式 (默认值
    w 写模式
    a 追加模式
    b 二进制模式(和其它模式一起使用,如'rb''wb'等)
    + 读/写模式(和其它模式一起使用,如'r+''w+'a+等)

    在这里需要进一步解释说明:

    • 以读模式打开文件,可以对文件进行读取内容,这要求文件必须存在,若不存在程序将报错中止。
    • 以写模式打开文件,可以往文件写入数据,需要注意的是,如果文件不存在将创建文件,如果文件存在会将文件内容清空
    • 读/写模式意思是即可读文件又可写文件,如'r+',以读模式打开文件,除了可以读取文件内容,还可以写入数据
    • 以追加模式打开文件不会将文件清空,可以以文件末尾为起点往文件写入数据,相当于特殊的读模式

    何为二进制模式?

    二进制模式有些特殊,这里单独说明。

    文本中的一些控制字符如换行符,在不同的系统中的存储形式是不同的,在Linux系统中存储的是 一个字符,而在Windows系统中存储的是 两个字符。

    为了通用性,python默认用文本模式打开一个文件,从文件中读取到的换行符,python会自动将其转换成一个 字符;写入数据的时候,python自动将 转换成对应系统的换行符形式后再写入文件。

    也就是说,以文本模式打开的文件,读取的内容不一定是原本的内容!

    如果需要操作文件的原始数据,就需要用到二进制模式打开文件了。

    不过这个模式我们暂时用不上,用到了再来补充吧。


    好了,现在我们以写模式打开一个文件,名为test.txt,这个文件不存在,python自动为我们创建,代码如下:

    fobj = open('test.txt', 'w')
    

    第一步完成!

    操作文件第二步——读和写

    写文件

    由于我们刚才以写模式打开了一个test.txt文件,文件无内容,我们先来说说如何往文件写入数据。

    往文件写入数据用到文件对象的一个write方法:

    fobj = open('test.txt', 'w')
    fobj.write('hello world!
    ') # 写入内容
    fobj.write('I am Lee
    ') # 写入内容
    

    该方法还返回一个整数,表示写入的字符数

    读文件

    如果以读模式打开了一个文件(这个文件要存在),那么我们可以使用文件对象的read方法来读取文件内容:

    fobj = open('test.txt', 'r') # 或者fobj = open('test.txt')
    content = fobj.read(10) # 读取10个字符
    print(content)
    content = fobj.read() # 读取剩下的所有字符
    print(content)
    

    read方法带参数时,表示读取的字符数(如果是二进制模式就是字节数),不带参数时表示读取剩下全部内容,如果文件比较小的时候可以直接读取全部内容,如果文件比较大不建议这么做,一是因为速度慢,二是因为文件内容过大,没有足够的内存可以一次性容纳这么多数据。


    注意:对文件的读和写操作时,文件对象有一个指针用于指定当前文件的操作位置,读文件的时候,会使这个指针往后移动。也就是说,我们读取文件内容时是按顺序读取的,读取完后就没有了,因为指针已经移动到文件末尾。不过我们可以使用文件对象的seek方法,手动改变这个指针的位置;写文件的操作也是类似,除非使用seek方法,否则我们无法将这次写入的数据写入到上一次写入的数据之前。

    操作文件最后一步——关闭文件

    操作完文件后要对其关闭,特别是更改了文件的数据的时候,可能造成写入的数据没有真正写入到文件中,这是因为写入数据的时候,是往缓冲区写入的,等缓冲区满了,或者关闭文件的时候才会将数据写入硬盘。

    操作很简单,调用close方法即可:

    fobj.close()
    

    一般情况下,程序退出后或者退出前,程序打开的文件会被自动关闭,但是如果程序因为错误中止了,很可能会出现数据没有被写入文件的现象,为了安全起见,使用完文件后应及时关闭。

    通常使用如下代码来保证文件正常关闭:

    f = open('test.txt', 'w')
    try:
        # do something
    finally:
        f.close()
    

    暂时不用理解tryfinally代码块的具体作用,我们只需要知道当try代码块发生错误是程序中止,或者程序正常运行下去,finally代码块都会执行。

    也可以使用如下代码:

    with open('test.txt', 'w') as f:
        # do something
    

    with代码块结束后,无论程序是否发生错误,会自动调用close方法来关闭文件


    最后总结起来,代码如下:

    首先是写文件:

    >>> fobj = open('test.txt', 'w')
    >>> fobj.write('hello world!
    ')
    13
    >>> fobj.write('I am Lee.
    ')
    10
    >>> fobj.close()
    

    然后读取这个写入的文件:

    >>> fobj = open('test.txt') # 默认模式为读模式'r'
    >>> fobj.read(10)  # 读取10个字符
    'hello worl'
    >>> fobj.read()  # 读取剩下的全部字符
    'd!
    I am Lee.
    '
    >>> fobj.close() # 没有对文件进行修改可不调用
    

    其它文件操作方式

    迭代文件

    我们读取文件的时候还可以使用for循环进行迭代,代码如下:

    >>> for line in open('test.txt'):
    ...     print(line, end='')  # end参数表示字符串最后附加的字符,默认为换行符
    ... 
    hello world!
    I am Lee.
    >>> 
    

    可以看到,每次循环我们得到文件的一行内容,在这里我们没有关闭文件,但是这没有必要,因为我们只是读文件,并没有改变文件的内容。

    这种读取文件的方法是我们最常用的方法。

    随机访问

    刚才我们说过,文件的操作都是从头到尾按顺序进行的,若想“回头”,就需要使用seek方法重新设置文件指针,具体用法如下:

    fobj.seek(offset[, whence])
    

    offset参数表示偏移量,正数为向后偏移,负数为向前偏移,0表示不偏移;whence参数表示起始位置,默认是0(表示相对于文件开头,偏移量为非负数),其它取值还有1(相对于当前位置,偏移量可正可负可0,),2(相对于文件末尾,偏移量为非正数)。

    同时还可以配合tell方法来使用,tell方法返回当前文件指针位置。

    具体可以看下面的例子:

    >>> f = open('test.txt', 'w+b') # 由于文本模式whence只能使用0,故使用二进制模式操作
    >>> f.write(b'hello world') # b''为字节串类型,类似字符串,二进制模式文件操作基于字节串
    11
    >>> f.tell() # 获取当前文件指针位置
    11
    >>> f.seek(-5, 2) # 定位到文件尾部向前5个字节
    6
    >>> f.read(6)
    b'world'
    >>> f.tell() # 获取当前文件指针位置
    11
    >>> f.seek(-7,1) # 向前7个字节
    4
    >>> f.write(b'haha')
    4
    >>> f.seek(0) # 相当于f.seek(0,0) 定位到文件头部
    0
    >>> f.read() # 读取所有文件内容
    b'hellhaharld'
    >>> f.close() # 关闭文件
    

    好了,本节教程就此结束,感谢读者的阅读,下一节教程要等到高考完了才有时间更新咯~

    ヾ( ̄▽ ̄)Bye~Bye~

  • 相关阅读:
    flutter 强制竖屏和横屏
    Error: ADB exited with exit code 1
    UVA-11426
    个人信息表格题
    Kubernetes 机器内核问题排查
    ETCD
    ubuntu16.04在使用vim的时候,中文乱码
    Kubernetes Ingress-Nginx 实现蓝绿、灰度发布
    MySQL高可用架构MHA+ProxySQL实现读写分离和负载均衡
    ElasticSearch
  • 原文地址:https://www.cnblogs.com/featherl/p/10705124.html
Copyright © 2011-2022 走看看