Python

Python学习

2021-04-02  本文已影响0人  逛逛_堆栈

第七天

回顾
我们前面说过变量、序列、对象,但变量、序列以及对象中存储的数据是暂时的,程序结束后就会丢失,如果希望程序结束后数据仍然保持,就需要将数据保存到文件中。Python提供了内置的文件对象,以及对文件、目录进行操作的内置模块,通过这些技术可以很方便地将数据保存到文件中。

Python文件基本操作

python中文件的操作通常可以分成两类:
1.系统级操作:删除、修改权限,作用于文件本身
2.应用级操作:读、写操作,作用于文件内容
思考:如何用word编写一份简历?
1、打开新建一个word文件;
2、写入个人信息并保存文件;
3、关闭word软件。
对于文件应用的操作通常有着较为固定的格式,可以归纳如下所示:

1.打开open文件,使用open()函数,返回一个文件对象;
2.读写read/write文件,这里主要有读文件有read(),readline(),readlines()函数;而写文件就有write()、writelines()函数;
3.关闭close文件,完成对文件的读写之后,需要对文件进行关闭,调用close()函数。
一个文件,必须在打开之后才能对其进行操作,并且在操作结束之后,还应该将其关闭,这 3 步的顺序不能打乱。

1、Python open函数

open函数

Python中如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。

语法:file = open(file_name [, mode='r' [ , buffering=-1 [ , encoding = None ]]])

file_name:要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。需要注意的是,如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可;否则,此参数需要指定打开文件所在的完整路径。

mode:可选参数,用于指定文件的打开模式。可选的打开模式如表 1 所示。如果不写,则默认以只读(r)模式打开文件。
注意:文件打开模式,直接决定了后续可以对文件做哪些操作。例如,使用 r 模式打开的文件,后续编写的代码只能读取文件,而无法修改文件内容。

r、只读模式打开文件,读文件内容的指针会放在文件的开头。
rb、以二进制格式、采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件等。
r+、打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。
rb+、以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)。
w、以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容。
wb、以二进制格式、只写模式打开文件,一般用于非文本文件(如音频文件)
w+、打开文件后,会对原有内容进行清空,并对该文件有读写权限。
wb+、以二进制格式、读写模式打开文件,一般用于非文本文件
a、以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾,反之则会创建新文件。
ab、以二进制格式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾,反之则会创建新文件。
a+、以读写模式打开文件;如果文件存在,文件指针放在文件的末尾,反之则会创建新文件。
ab+、以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾;反之,则创建新文件。

buffering:可选参数,用于指定对文件做读写操作时,是否使用缓冲区。

通常情况下、建议大家在使用 open() 函数时打开缓冲区,即不需要修改 buffing 参数的值。
如果 buffing 参数的值为 0(或者 False),则表示在打开指定文件时不使用缓冲区;如果 buffing 参数值为大于 1 的整数,该整数用于指定缓冲区的大小(单位是字节);如果 buffing 参数的值为负数,则代表使用默认的缓冲区大小。

encoding:手动设定打开文件时所使用的编码格式,不同平台的 ecoding 参数值也不同,以 Windows 为例,其默认为 cp936(实际上就是 GBK 编码)。

open()文件对象常用的属性

成功打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,其常见的属性为:

file.name:返回文件的名称;
file.mode:返回打开文件时,采用的文件打开模式;
file.encoding:返回打开文件时使用的编码格式;
file.closed:判断文件是否己经关闭。

import os
file = open('1.txt','r')
print(file.mode)  # 'r'
print(file.encoding)  # cp936
print(file.name)   # 1.txt
print(file.close())  # None

注意,使用 open() 函数打开的文件对象,必须手动进行关闭,Python 垃圾回收机制无法自动回收打开文件所占用的资源。

2、Python read函数

Python提供了如下 3 种函数,它们都可以帮我们实现读取文件中数据的操作:

1、read() 函数:逐个字节或者字符读取文件中的内容;

借助 open() 函数,并以可读模式(包括 r、r+、rb、rb+)打开的文件,可以调用 read() 函数逐个字节(或者逐个字符)读取文件中的内容。
格式:file.read([size])
file 表示打开的文件对象;size 作为一个可选参数,用于指定要读取的字符个数,如果省略,则默认一次性读取所有内容。

# import  os
# file = open('1.txt','r')  # 1.txt中是中文
# str = file.read(3)
# print(str)
# file.close()
# 'gbk' codec can't decode byte 0xac
import  os
file = open('1.txt','r',encoding='utf-8')
str = file.read(3)
print(str)  # 哈哈哈
file.close()

2、readline() 函数:逐行读取文件中的内容;

readline() 函数用于读取文件中的一行,包含最后的换行符“\n”。此函数的基本语法格式为: file.readline([size])。

import  os
file = open('1.txt','r',encoding='utf-8')
str = file.readline()
print(str)  # 我是第一行第一列数据   我是第一行第二列数据
file.close()

注意:由于 readline() 函数在读取文件中一行的内容时,会读取最后的换行符“\n”,再加上 print() 函数输出内容时默认会换行,所以输出结果中会看到多出了一个空行,实际在控制台的效果是两行。

3、readlines() 函数:一次性读取文件中多行内容。

readlines() 函数用于读取文件中的所有行,和 readline() 函数一样,readlines() 函数在读取每一行时,会连同行尾的换行符一块读取。

import  os
file = open('1.txt','r',encoding='utf-8')
str = file.readlines()
print(str)
file.close()
# ['我是第一行第一列数据      我是第一行第二列数据\n', '我是第二行第一列数据      我是第二行第二列数据']

3、Python write函数

前面我们说了使用 read()、readline() 和 readlines() 这 3 个函数读取文件,如果我们想把一些数据保存到文件中,又该如何实现呢?这个时候就需要用到python中的write、writelines函数了。

1、write函数

语法:file.write(string)
其中,file 表示已经打开的文件对象;string 表示要写入文件的字符串(或字节串,仅适用写入二进制文件中)。
注意,在使用 write() 向文件中写入数据,需保证使用 open() 函数是以 r+、w、w+、a 或 a+ 的模式打开文件,否则执行 write() 函数会抛出 io.UnsupportedOperation 错误。

import  os
file = open('2.txt','w',encoding='utf-8')
file.write('首次写入数据')
file.close()

注意:打开文件模式中包含 w(写入),那么向文件中写入内容时,会先清空原文件中的内容,然后再写入新的内容。因此运行上面程序,再次打开 a.txt 文件,只会看到新写入的内容。

追加模式打开文件,则不会清空原有内容,而是将新写入的内容会添加到原内容后边。

import  os
file = open('2.txt','a',encoding='utf-8')
file.write('首次写入数据5\n')
file.close()

注意:不论是采用那种方式写入数据,file.close不可缺少。当我们在写入文件内容时,操作系统不会立刻把数据写入磁盘,而是先缓存起来,只有调用 close() 函数时,操作系统才会保证把没有写入的数据全部写入磁盘文件中。

2、writelines函数

Python 的文件对象中,不仅提供了 write() 函数,还提供了 writelines() 函数,可以实现将字符串列表写入文件中。

# 将一个文件中所有内容复制到另一个文件
import  os
open_file = open('1.txt','r',encoding='utf-8')
write_file = open('3.txt','w',encoding='utf-8')
write_file.writelines(open_file.read())
write_file.close()
open_file.close()

注意:使用 writelines() 函数向文件中写入多行数据时,不会自动给各行添加换行符。

4、Python tell和seek

1、Python tell函数

tell() 函数用于判断文件指针当前所处的位置。语法:file.tell()。

import  os
read_file = open('2.txt','r',encoding='utf-8')
print(read_file.tell())  # 0
print(read_file.read(3)) # 日照香
print(read_file.tell())  # 9
read_file.close()
#utf-8编码:一个中文包含繁体字等于三个字节,一个英文字符一个字节。
#gbk编码:一个中文包含繁体字等于二个字节,一个英文字符一个字节。

2、Python seek函数

seek() 函数用于将文件指针移动至指定位置,该函数的语法格式如下:

file.seek(offset[, whence])

各个参数的含义如下:

offset:表示相对于 whence 位置文件指针的偏移量,正数表示向后偏移,负数表示向前偏移。例如,当whence == 0 &&offset == 3(即 seek(3,0) ),表示文件指针移动至距离文件开头处 3 个字符的位置;当whence == 1 &&offset == 5(即 seek(5,1) ),表示文件指针向后移动,移动至距离当前位置 5 个字符处。

whence:作为可选参数,用于指定文件指针要放置的位置,该参数的参数值有 3 个选择:0 代表文件头(默认值)、1 代表当前位置、2 代表文件尾。

注意,当 offset 值非 0 时,Python 要求文件必须要以二进制格式打开,否则会抛出 io.UnsupportedOperation 错误。

read_file = open('2.txt','rb') # 二进制不要设置编码集
print(read_file.tell()) # 指针初始位置 0
print(read_file.read(1)) 
print(read_file.tell())  # 1
read_file.seek(5) # 将文件指针从文件开头,向后移动到 5 个字符的位置
print(read_file.tell())  # 5
print(read_file.read(1))
read_file.seek(5,1)
print(read_file.tell())  # 11
read_file.close()

5、Python with as使用

Python中使用 with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。使用 with as 操作已经打开的文件对象,无论期间是否抛出异常,都能保证 with as 语句执行完毕后自动关闭已经打开的文件。

语法:
with 表达式 [as target]:
代码块

import  os
with open('4.txt','w') as w_file:
    w_file.write('Good Job')

优点:

1、自动释放对象,不需要我们手动close;

2、优化try/catch,导致代码复杂化;

3、保障程序的正常执行。

上一篇下一篇

猜你喜欢

热点阅读