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~

  • 相关阅读:
    Python使用SMTP模块、email模块发送邮件
    harbor搭建及使用
    ELK搭建-windows
    ELK技术栈之-Logstash详解
    【leetcode】1078. Occurrences After Bigram
    【leetcode】1073. Adding Two Negabinary Numbers
    【leetcode】1071. Greatest Common Divisor of Strings
    【leetcode】449. Serialize and Deserialize BST
    【leetcode】1039. Minimum Score Triangulation of Polygon
    【leetcode】486. Predict the Winner
  • 原文地址:https://www.cnblogs.com/featherl/p/10705124.html
Copyright © 2011-2022 走看看