Python开发【第六篇】:文件处理

1. 文件

  文件处理流程:python

  • 打开文件,得到文件句柄,并赋值
  • 经过句柄对文件进行操做
  • 关闭文件

1.1 打开文件

  在 Python 中使用 open()函数打开文件,并返回文件对象:函数

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

  open 函数有不少参数,通常地只需了解三个便可。第一个是文件对象,第二个是打开模式,第四个是编码方式编码

Tips:open 函数打开文件采用的默认编码方式是系统编码,Windows 为 GBK;若打开的文件是 utf-8,那么须要指定编码方式为 utf-8,不然乱码。指针

文件打开模式
打开模式 说明
r 只读方式打开(默认)
x 若是文件存在,打开引起异常
b 以二进制方式打开文件
+ 可读写模式(可添加到其余模式中)
w 只写方式打开,会覆盖已存在文件
a 以写入模式打开,文件存在,在末尾追加
t 以文本模式打开(默认)
U 通用换行符支持

  使用 open 函数打开一个文件,能够得到文件对象(或句柄),利用文件对象,咱们就能够对文件进行读取或 修改操做:日志

f = open('C:\\Users\\HJ\\Desktop\\a.txt')

Tips:open 函数默认以只读模式打开文本文件,即 rt 模式,打开二进制须要 b 模式。code

1.1.1 文件对象方法

  打开文件后得到文件对象,利用文件对象的一些方法,咱们能够对文件内容进行读取或修改。视频

文件对象方法
文件对象方法 说明
read([n]) 读取文件(所有读取),以本身为单位读取
readable() 判断文件是否可读,返回布尔值
readline() 一次读取一行,默认换行,f.readline(),end=''不换行
readlines() 读取全部内容,存成列表
write(str) 将字符串写入文件
writeable() 判断文件是否可写
writelines(seq) 写入一个序列,元素必须是字符串
seek(offset,from) 在文件中移动文件指针
tell() 返回当前在文件中的位置
close() 关闭文件

1.1.2 with 关键字

  使用 open 函数打开文件,每次都须要关闭文件,非常麻烦。一旦没有关闭,文件就会有泄漏的风险。而 Python 为咱们提供了一个关键字 with,不须要咱们每次本身关闭文件,Python 内部会自动关闭。对象

with open('a.txt') as f:        # f 即为文件对象
    f.read()

  打开一个文件,并将内容写入另外一个文件中:blog

with open('a.txt', 'r', encoding='utf-8') as f1,
     open('b.txt', 'w', encoding='utf-8') as f2:
        data = f1.readlines()   # 存为列表
        f2.write(data[0])       # 只写入第一行

1.1.3 文件定位

  tell()方法图片

  read 方法以 字节读取文件,不指定参数,默认所有读取,文件指针指向文件末尾。使用 tell 方法能够查看文件指针位置。

# test_file.txt
第一行
第二行
f = open('test_file',  encoding='utf-8', newline='')
data = f.readlines()
print(f.tell())
print(data)
f.close()

22
['第一行\r\n', '第二行\r\n']

  文件默认不显示 \r\n,每一个汉字 3 个字节,总共 6 个汉字(即 18 个字节)。再加上两个 \r\n(即 4 个字节),总计 22 个字节,显然文件指针已经指向文件末尾。

Tips:在不一样系统中换行符不一样,Windows 中为 \r\n,Linux 中为\n。Python 为了更好地兼容其余平台,统一转换为 \n,要想查看真实的换行符,可在 open 函数中指定 newline = ''

  默认不显示换行符:

f = open('test_file',  encoding='utf-8')
print(f.read())
print(f.tell())

第一行
第二行
22

  使用 readlines()只能看到 \n

f = open('test_file',  encoding='utf-8')
print(f.readlines())
print(f.tell)   

['第一行\n', '第二行\n']
22

  seek()方法

  文件指针即用来定位光标所在,至关于一个书签,seek()方法能够用来设置文件指针的位置,它的单位也是 字节

seek(offset, from)
seek(3)     # 移动 3 个字节

  seek()有两个参数:第一个 offset 为偏移量(即偏移字节),第二个 from 表示从哪一个位置开始偏移,from 为三种模式:

  • 0:表示从文件开头位置偏移
  • 1:表示从当前位置偏移,必须以 rb 模式打开,最后再解码
  • 2:表示从文件末尾开始偏移,必须以 rb 模式打开,最后再解码

  从文件开始位置偏移:

f = open('test_file',  encoding='utf-8')
print(f.tell())         # 文件刚打开时位置为 0
f.seek(10, 0)           # 偏移 10 个字节,即第一行 \r 的后面,那么剩下的还要 \n 和 第二行内容
print(f.tell())         
print(f.read())
f.close()

0
10

第二行

  从当前位置偏移:

f = open('test_file', 'rb')
f.seek(3, 0)        # 移动 3 个字节
print(f.tell())      # 3 位置
f.seek(3, 1)            # 在 3 位置,再移动 3 个字节
print(f.tell())
print(f.read().decode('utf-8'))
f.close()

3
6
行
第二行

  首先移动 3 个字节,再移动 3 个字节,指针到了第一行内容(第一行)中一的后面,再读取后面的内容。

  文件末尾偏移:

f = open('test_file', 'rb')
f.seek(-5, 2)
print(f.tell())
data = f.readlines()
print(data)
print(data[-1].decode('utf-8'))
f.close()

17
[b'\xe8\xa1\x8c\r\n']       # 二进制,须要解码
行

  访问文件的两种方式

  设置一个查看日志的程序(查看日志通常都是查看最新的,即文件最后位置的内容)。

  方法一:

  使用 readlines()方法查看,缺点是须要所有将文件读取出来,加载到内存才能读取最后一行,消耗时间和内存。

f = open('a.txt', encoding='utf-8')
data = f.readlines()
print(data[-1])

  方法二:

  利用 seek()方法,将文件指针移动到文件末尾,从文件末尾开始读取。

f = open('a.txt', 'rb')
for i in f:
    offs = -10
    while True:
        f.seek(offs, 2)
        data = f.readlines()
        if len(data) > 1:           # 大于 1 表示读了两行
            print('文件最后一行是:%s' % (data[-1]).decode('utf-8'))
            break
        offs *= 2       # 小于 1 表示没有最后一行没有读完,再将偏移量翻倍

1.2 文件写入

  写入文件必须是 w 或 a 模式打开文件,只能写入字符串,不能写入其余数据类型。

1.2.1 w、a 模式

  w 模式打开文件,文件存在则覆盖原有内容,文件不存在则新建。a 模式打开文件,文件追加到文件末尾:

f = open('a.txt', 'w', encoding='utf-8')
f.write('123\n')        # 要加换行
f.writelines(['45\n', '67\n'])      # 写入一个列表

1.2.2 + 模式

  +表示同时能够对文件进行读写操做。

模式 说明 模式 说明
r+ 读写 w+ 读写
x+ 写读 a+ 写读

1.2.3 b 模式

  b 模式以字节为单位打开文件,便可打开二进制文件(包括视频、图片、音频等),打开时不能指定编码方式。

  一个文件在未保存时,它是存在于内存中(字符串形式)。当要存储到硬盘上时,便须要编码成字节码(bytes),同理硬盘上的内容加载处理,须要解码(decode)成字符串(str):

# a.txt
第一行
f = open('test_file', 'rb')
data = f.read()
print(data)
print(data.decode('utf-8'))

b'\xe7\xac\xac\xe4\xb8\x80\xe8\xa1\x8c\r\n\r\n'
第一行

  wb 、ab模式

  以二进制格式写入文件,会覆盖原文件。只能写入二进制文件,所以写入的字符串必须编码成二进制。

f = open('a.txt', 'wb')
f.write(bytes('你好\n', encoding='utf-8'))
#f.write('你好\n'。encode('utf-8'))

  以上两种方式均可以写入文件,ab 末尾则是在末尾追加。

1.2.4 其余文件对象方法

f.closed():判断文件是否关闭
f.encoding:查看文件打开的编码
f.flush():刷新(每过几秒自动保存)从内存到硬盘

1.3 总结

  open 函数打开文件六种模式r、r+、w、w+、a、a+的区别:

  • r:只读
  • r+:可读写,直接写入文件,则从文件开头开始写,覆盖原有内容。若先读后写则在文件末尾追加。
  • w:只写,覆盖文件内容,文件不存在则新建
  • w+:可读写,若是文件存在,则覆盖整个文件内容。不存在则新建。
  • a:只写,从文件末尾追加内容,文件不存在则新建
  • a+:可读写,从文件开头读取内容,从文件末尾添加内容
相关文章
相关标签/搜索