python基础——文件操作

image.png

python基础

文件的基本操作

文件操作步骤

以word文档为例,打开一个文件需要经过以下几个步骤:

  1. 打开
  2. 读或写或其他操作
  3. 关闭
    也可以只打开和关闭文件,不进行任何操作

文件操作的作用

文件操作就是把一些内容或者数据存储在一个地方,可以让我们更方便的读取和应用以及共享

打开文件的模式

打开文件使用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

你可能感兴趣的:(python基础——文件操作)