open函数

语法:
open(name[, mode[, buffering]])
解释:

  • name : 一个包含了你要访问的文件名称的字符串值。
  • mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
  • buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。

open函数的模式(mode):

  • r:以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
  • w:打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
  • a:打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
  • r+:打开一个文件用于读写。文件指针将会放在文件的开头。
  • w+:打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
  • a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
  • rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
  • wb:以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
  • ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
  • rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
  • wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
  • ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

open函数的方法:

  • fp.read([size]):size为读取的长度,以字符数量为单位,并不是以字节为单位
  • fp.readline([size]):读一行,如果定义了size,有可能返回的只是一行的一部分
  • fp.readlines([size]):把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
  • fp.write(str):把str写到文件中,write()并不会在str后加上一个换行符
  • fp.writelines(seq):把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
  • fp.close():关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。 如果一个文件在关闭后还对其进行操作会产生ValueError
  • fp.flush():把缓冲区的内容写入硬盘
  • fp.fileno():返回一个长整型的"文件标签"
  • fp.isatty():文件是否是一个终端设备文件(unix系统中的)
  • fp.tell():返回文件操作标记的当前位置,以文件的开头为原点
  • fp.next():返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
  • fp.seek(offset[,whence]):将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
  • fp.truncate([size]):把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。

文件的打开与关闭

打开文件

在Python中,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。
f = open('test.txt', 'w')

关闭文件

f = open('test.txt', 'w')
f.close()

路径说明

  • 绝对路径:从盘符开始的路径
  • 相对路径,相对当前源码所在的路径

绝对路径中为了不让\产生转义效果,需要在路径前天添加字符r,否则需要将每个\进行转义

f = open(r'E:\tmp\test.txt', 'w')
f.write('test')
f.close()

中文编码

在未指定写入字符集时,运行pycharm中编写的程序,输出中文到文件中,可能出现乱码情况,需要通过设置pycharm的默认字符集:文件-设置-编辑器-文件编码-项目编码,设置为UTF-8。
也可以在打开文件时通过encoding指定写入中文的字符集为UTF-8:

f = open(r'E:\tmp\test.txt', 'w', encoding='UTF-8')
f.write('test')
f.close()

文件读写

write

f = open(r'E:\tmp\test.txt', 'w', encoding='UTF-8')
f.write('test1')
f.close()

在同一个open文件的范围中,如果多次写入数据,那么是追加方式,如果在不同的open文件范围中,通过w方式进行写入是覆盖方式。

writelines

一次性写入多行

f = open(r'E:\tmp\test.txt', 'w', encoding='UTF-8')

# 通过换行符实现多行写入
f.write('test1\ntest2\ntest3\n')

#通过writelines一次性写出列表的每个元素
content = ['test1\n', 'test2\n', 'test3\n']
f.writelines(content)

# 使用字符串的join函数,为每个元素添加换行
content = ['test1', 'test2', 'test3']
f.write("\n".join(content))
f.close()

read

使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字符),如果没有传入num,那么就表示读取文件中所有的数据。

如果一个文件被读了多次,那么后面一次读的起始位置是上一次读的结束位置。

f = open(r'E:\tmp\test.txt', 'r', encoding='UTF-8')
# data1 = f.read()    # 未指定长度,读取所有数据
# print(data1)
# print('-------------')

data2 = f.read(2)
print(data2)
print('-------------')

data3 = f.read(3)
print(data3)
f.close()

readline

f = open(r'E:\tmp\test.txt', 'w', encoding='UTF-8')
f.write('test\n' * 10)
f.close()

f = open(r'E:\tmp\test.txt', 'r', encoding='UTF-8')

while True:
    content = f.readline()
    if content:
        print(f"{content}",end="")
    else:
        break
f.close()

readlines

读取多行,一次性读取全部文件为列表,每行都是列表的一个字符串元素。

f = open(r'E:\tmp\test.txt', 'w', encoding='UTF-8')
f.write('test\n' * 10)
f.close()

f = open(r'E:\tmp\test.txt', 'r', encoding='UTF-8')

data = f.readlines()
print(data)
f.close()

所在位置(tell)

返回指针当前所在的位置(指针所在位置前面的字节数)。

f = open(r'E:\tmp\test.txt', 'w', encoding='UTF-8')
f.write('Hello, World!')
f.close()

f = open(r'E:\tmp\test.txt', 'r', encoding='UTF-8')
content = f.read(2)     # 定位在2个字节后
print(content)
content = f.read(3)     # 在两个字节后读取3个字节,当前定位应该在5
print(content)
print('当前指针位置:',f.tell())
f.close()

返回结果如下:

He
llo
当前指针位置: 5

定位(seek)

语法:
seek(offset[,whence])
解释:
offset:开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选默认值为0,给offset参数一个定义,表示要从那个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起

f = open(r'E:\tmp\test.txt', 'w', encoding='UTF-8')
f.write('Hello, World!')
f.close()

f = open(r'E:\tmp\test.txt', 'r', encoding='UTF-8')
content = f.read(2)     # 定位在2个字节后
print(content)
f.seek(3)               # 直接定位在3个字节后
content = f.read(3)     # 读取3个字节
print(content)
print('当前指针位置:',f.tell())
f.close()

返回结果如下:

He
lo,
当前指针位置: 6

访问模式

image

二进制读写

二进制文件的读写主要应用在图片、音乐、视频等文件的读写

  • rb:read binary,读取二进制文件
  • wb:write binary,写入二进制文件

将文件的内容单纯的用0和1来进行读取和存储。不用指定字符集。

文件对象的函数和属性

flush()刷新缓冲区

文件写入过程:数据-->缓冲区(内存中)-->文件中(硬盘上)
缓冲区清空的时间点:

  • 当文件关闭的时候,自动清空缓冲区
  • 当整个程序运行结束的时候自动清空缓冲区
  • 当缓冲区写满了,会自动清空缓冲区
  • 手动清空缓冲区

truncate()截断文件

truncate函数,从指针位置到结束的字符全部删除掉,只保留指针之前的内容。

文件对象

文件对象是一个可迭代对象;可以直接通过遍历访问到每一行内容

f = open(r'E:\tmp\test.txt', 'r', encoding='UTF-8')
for line in f:      # 循环文件每一行的内容
    print(line)

# 可以通过文件对象的方法获取文件的属性及状态
print("文件名:", f.name)
print("文件的打开模式:", f.mode)
print("文件可写:", f.writable())
print("文件可读:", f.readable())
f.close()

返回结果如下:

Hello, World!
文件名: E:\tmp\test.txt
文件的打开模式: r
文件可写: False
文件可读: True

星霜荏苒 居诸不息