文件操作

文件

主要内容:

  • 文件的介绍
  • 文件的操作方法
  • 文件的修改方法

 

文件的介绍

  什么是文件?为什么要用文件呢?

  文件就是操作系统暴露给用户的一种可以简便操作硬盘的一个接口。人们需要永久的将数据保存到硬盘中,这就需要使用文件来帮忙,简言之就是文件是一种永久保存数据的方式。

文件的操作方法

  在Python中,操作文件的方法是内置方法open.

  open(file, mode='r', encoding=None),这是open方法常用的三个参数,第一个是文件名,第二参数是文件的打开模式,第三个是打开文件使用的编码方式,默认是操作系统使用的编码方式。这个方法返回的是一个文件对象,或者说是文件的句柄,可以让我们随意操作文件。   

  下面先说文件的3种打开方式

  1.  r模式,  文件的只读模式(read only)

  2.  w模式, 文件的只写模式(write only)

  3.  a模式,  文件的追加模式(write only)

  其中r模式只能读文件内容,当文件不存在时会报错;w模式是只能写文件,当文件不存在时会创建新文件,然后写,文件存在时会覆盖原文件进行写入。a模式当文件不存在时,与w模式一样,当文件存在时,会先定位到文件末尾,然后写入,不会覆盖原文件。

  这三种模式后还可以加2种文件单位

  1. t 文本模式  默认模式,一般可以省略

  2. b 二进制模式 当读取视频文件,图片文件时可以指定该模式。

文件的常用方法

  close(): 文件的关闭

  open()方法返回的是文件的句柄,是占用了操作系统的资源,Python垃圾回收器回收的只是这个文件的一个引用,并不会回收文件被操作系统打开所占用的资源,所以一般文件要主动关闭以防止资源的浪费。

  通常我们不适用close()方法,而是使用文件的上下文管理器with 语句来做到文件的自动关闭。如下所示,不用自动关闭文件。

 

>>> with open('a.txt') as f:
...     print(f.read())
...
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
>>> f.closed
True

 

  readable(),writable(): 返回文件是否可读或可写。

 

>>> with open('a.txt') as f:
...     print(f.readable())
...     print(f.writable())
...
True
False

 

  readline(): 读取文件的一行,此处功能与文件的被for循环迭代获取一行功能一样

>>> with open('a.txt') as f:
...     for line in f:
...             print(line)
...
apple 10 3

tesla 100000 1

>>> with open('a.txt') as f:
...     print(f.readline())
...     print(f.readline())
...
apple 10 3

tesla 100000 1

  seek(offset: int, whence: int = 0): 改变文件指针的位置

       seek方法第一个参数是偏移量,可正可负,此处重点是偏移量都是按照字节数计算的,例如utf-8中,一个中文字符就需要偏移3,英文字符需要偏移量按1计算, 第二个参数可取3种值0,1,2 取0的时候是相对于文件开头的偏移量,此时支持文件打开为文本模式或二进制模式。当whence取1的时候,是相对于指针当前的偏移量,但此时只支持文件打开的b模式,取2的时候,是相对于文件末尾的偏移量,此时只支持b模式。

下面是一个利用seek方法实现的简易实时监测文件输入的小程序。

 

import time

pos = 0
while True:
    f = open('test', 'rb')
    if pos != 0:
        f.seek(pos)  # 直接定位到上次的位置

    while True:
        line = f.readline()
        if line.strip():
            print(line.strip())
        pos += len(line)
        if not line.strip():
            break
    time.sleep(0.1)
    f.close()

 

  第二种:

with open('test', 'r', encoding='utf-8') as f:
    f.seek(0, 2)
    while True:
        res = f.readline()
        if res:
            print(res)
        time.sleep(0.1)

  truncate(size): 文件的截断,意思是在截断文件指定字节之后的所有内容。

with open('test', 'a', encoding='utf-8') as f:
    f.truncate(6)

         

  效果就是截断了后面所有的字符,这个只能在a模式下使用,因为w模式会清空原文件。

文件的修改

  方法1:直接一起读出来修改,缺点是浪费内存,当文件很大的时候.

with open('test', 'r', encoding='utf-8') as read_f:
    content = read_f.read()

with open('test', 'w', encoding='utf-8') as write_f:
    write_f.write(content.replace('中文', '英文'))

  方法2: 用一个备份文件,一行一行读原文件,然后直接修改再写入备份文件,最后删除原文件,然后重命名备份文件为原文件,这就相当于修改了原文件。优点就是节省内存,与方法1相比也就是同时存在两份文件,稍微浪费了点硬盘空间。

with open('test', 'r', encoding='utf-8') as read_f, \
     open('temp', 'w', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('中文', '英文'))

os.remove('test')
os.rename('temp', 'test')

  

 

 

posted @ 2019-07-08 20:05  yscl  阅读(107)  评论(0)    收藏  举报