image.png
python基础
文件的基本操作
文件操作步骤
以word文档为例,打开一个文件需要经过以下几个步骤:
- 打开
- 读或写或其他操作
- 关闭
也可以只打开和关闭文件,不进行任何操作
文件操作的作用
文件操作就是把一些内容或者数据存储在一个地方,可以让我们更方便的读取和应用以及共享
打开文件的模式
打开文件使用open函数,返回值为文件对象
参数:
- file_name:文件名,如果文件不在当前目录中需要指定路径
- mode='r':【可选】打开模式,如果不写默认为r只读打开
- buffering=None:【可选】整数,用于设置缓冲策略。0表示关闭缓冲(只允许在二进制模式,否则报错ValueError: can't have unbuffered text I/O),1表示选择行缓冲(仅在文本模式下可用),并以整数> 1表示 固定大小的块缓冲区的大小。没有缓冲参数时 默认的缓冲策略如下:
- 二进制文件:以固定大小的块进行缓冲;缓冲区的大小通常为4096或8192字节长。
- 文本文件:使用行缓冲
- encoding=None: Encoding是用于解码或编码。只在文本文件被使用,默认为utf-8
- errors=None: 如何处理编码错误,只适用于文本模式
处理标准 | 错误含义 |
---|---|
strict | 如果存在编码错误拋异常,和默认None效果一样 |
ignore | 忽略错误,但是需要注意如果忽略错误会导致数据丢失 |
replace | 将错误部分替换为� |
backslashreplace | 用 Python 的反斜杠转义序列替换格式错误的数据。 |
使用utf-8编码写的中文使用gbk进行读取
UnicodeDecodeError: 'gbk' codec can't decode byte 0x97 in position 0: incomplete multibyte sequence # strict
hello鍚 # ignore
hello鍚� # replace
hello鍚\x97 # backslashreplace
- newline=None:控制通用换行符的工作方式,只适用于文本模式,可取的值有None、''、'\n'、'\r'和 '\r\n'【'\n'、'\r'和 '\r\n'都会进行换行】
- 如果是读,如果newline为none,通用换行模式开启,所有换行符都被转换为'\n',如果newline为'',通用换行模式开启,但是返回之前并不对换行符进行转换。如果newline为其他有效值,只有该值为换行符,也就是只按该值换行,不对换行符进行转换
- 如果是写w或a,如果newline为none,任意'\n'都会被转换为系统的默认分隔符,可以通过执行os.linesep来查看自己系统的换行符是什么,mac为'\n',如果newline为''或'\n',不进行任何转换,如果是其他有效值,将'\n'转换成给定值
f = open('test.txt', 'w', 10, None, None, None)
f.write('nihaoya\nhaojiubujianle\r\nnizuijinhaoma\r')
f.close()
f = open('test.txt', 'r', 1, None, None, '')
print(f.readlines())
f.close()
# 先看写,将读的newline置为''不进行任何转换
'''
更改写的newline
None:['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r'] # 将\n转换为系统换行符,mac执行os.linesep依旧是\n,所以相当于没有转换
'':['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r'] # 没有进行转换
'\n':['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r'] # 没有进行转换
'\r':['nihaoya\r', 'haojiubujianle\r', '\r', 'nizuijinhaoma\r'] # 将\n转换成了\r
'\r\n':['nihaoya\r\n', 'haojiubujianle\r', '\r\n', 'nizuijinhaoma\r'] # 将\n转换成了\r\n
'''
# 下面将写部分的newline置为'',看读
'''
更改读的newline
None:['nihaoya\n', 'haojiubujianle\n', 'nizuijinhaoma\n'] # 所有换行符都被换成了\n
'':['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r'] # 原样,没有进行任何转换
'\r':['nihaoya\nhaojiubujianle\r', '\nnizuijinhaoma\r'] # 只按\r进行换行
'\n':['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r'] # 只按\n进行换行
'\r\n':['nihaoya\nhaojiubujianle\r\n', 'nizuijinhaoma\r'] # 只按\r\n进行换行
'''
- closefd=True:如果closefd是False并且给出了文件描述符而不是文件名,则在文件关闭时底层文件描述符将保持打开状态。如果给定文件名closefd必须是True(默认值),否则将引发错误。
打开模式mode类别
类别 | 描述 |
---|---|
r | 只读,文件指针在文件的开头,如果文件不存在会抛异常 |
rb | 以二进制格式打开文件,只读,文件指针在文件的开头,如果文件不存在会抛异常 |
r+ | 读写,文件指针在文件的开头,如果文件不存在会抛异常 |
rb+ | 以二进制格式打开文件,读写,文件指针在文件的开头,如果文件不存在会抛异常 |
w | 只写【覆盖】,文件指针在文件的开头,如果文件存在,则打开后覆盖原有内容,若文件不存在会新建文件 |
wb | 以二进制格式打开文件,只写【覆盖】,文件指针在文件的开头,如果文件存在,则打开后覆盖原有内容,若文件不存在会新建文件 |
w+ | 读写【覆盖】,文件指针在文件的开头,如果文件存在,则打开后覆盖原有内容,若文件不存在会新建文件 |
wb+ | 以二进制格式打开文件,读写【覆盖】,文件指针在文件的开头,如果文件存在,则打开后覆盖原有内容,若文件不存在会新建文件 |
a | 只写【追加】,文件指针在文件的结尾,如果文件存在,则打开后覆盖原有内容,若文件不存在会新建文件 |
ab | 以二进制格式打开文件,只写【追加】,文件指针在文件的结尾,如果文件存在,则打开后覆盖原有内容,若文件不存在会新建文件 |
a+ | 读写【追加】,文件指针在文件的结尾,如果文件存在,则打开后覆盖原有内容,若文件不存在会新建文件 |
ab+ | 以二进制格式打开文件,读写【追加】,文件指针在文件的结尾,如果文件存在,则打开后覆盖原有内容,若文件不存在会新建文件 |
文件对象方法
读
- read
语法:read(n:int)
参数解释:n:字节,指定n后每次读取n个字节。若不指定默认读取文件所有内容
用途:按字节读取文件
print(f.read())
'''
nihaoya
haojiubujianle
nizuijinhaoma
'''
print(f.read(2)) # ha
- write
语法:write(s:Anystr)
参数解释:s:需要向文件中写入的字符串,内容必须为字符串,不能为int值或其他
用途:写操作
f.write('nihaoya\nhaojiubujianle\r\nnizuijinhaoma\r')
- readlines
语法:readlines(hint:int)
参数解释:hint:字节,如果0<字节<=文件第一行的字节数,则返回的列表中只有一个元素为第一行的全部数据,如果文件第一行的字节<字节<=文件第二行的字节,则返回的列表中有两个元素为前两行的全部数据,以此类推。如果字节<=0,则返回全部内容
用途:按行读取文件,返回一个列表,列表中的每个元素存放的是文件中的每行内容
print(f.readlines(7)) # ['nihaoya\n']
print(f.readlines(23)) # ['nihaoya\n', 'haojiubujianle\r\n']
print(f.readlines()) # ['nihaoya\n', 'haojiubujianle\r\n', 'nizuijinhaoma\r']
- writelines
语法:writelines(lines:iterable[Anystr])
参数解释:lines:列表,列表中的每个元素都得是字符串类型,遍历列表中的元素写入到文件中
用途:一次性向文件中写入一序列的内容,如果需要换行需手动指定换行符
f.writelines(['nihaoya\n','haojiubujianle\r\n','nizuijinhaoma\r'])
- readline
语法:readline(limit:int)
参数解释:limit:字节,如果该行的字节数>字节>=0,则输出指定字节的元素,如果字节数小于0则输出该行全部内容,如果字节数大于等于改行的字节数则输出该行的全部内容
用途:按行读取文件,每调用一次就是读取一行文件。读取文件时每行都会输出
print(f.readline(2)) # ni
print(f.readline()) # nihaoya
print(f.readline(0)) # 啥也没有
print(f.readline(-2)) # nihaoya
print(f.readline(23)) # nihaoya
- seek
语法:seek(offset:int,whence:int)
参数解释:
offset:偏移量,需要移动偏移的字节数。
whence:指定从哪个位置开始偏移。
0:从文件开头开始偏移
1:从当前位置开始偏移
2:从文件末尾开始偏移
用途:用于移动文件读取指针到指定位置。
# nihaoya\n
f.seek(2,0)
print(f.readline(2)). # ha
- flush
语法:flush()
用途:刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。在close文件之前就可以写入到文件中,如果没有flush则需要等调用close之后文件中才会出现 - isatty
语法:isatty()
用途:如果文件连接到一个终端设备返回 True,否则返回 False。 - readable、writable
语法:readable()、writable()
用途:返回bool值,readable判断文件是否可读,若有读权限则返回True。writable判断文件是否可写,若有写权限则返回True
f = open('test.txt', 'w', 10, None, None, '')
print(f.writable()) # True
print(f.readable()) # False
- tell
语法:tell()
用途:返回文件指针当前所在位置。
print(f.tell()) #0
f.seek(2,0)
print(f.tell()) #2 先从文件开头处偏移了两个字节,故位置变为2
- truncate
语法:truncate(size:int)
参数解释:如果存在则文件截断为 size 字节。
用途:截取文件,截取的字节通过size指定,默认为当前文件位置。
f = open('test.txt', 'r+', 1, None, None)
f.truncate(2)
print(f.read()) # ni
该方法的应用场景为r+或a,先截取后读,截取后文件中的内容也会被刷新为截取的字符串,如果在w+模式会填充为两个空串,因为w为覆盖模式。如下image.png