1,打开文件
python中的文件操作需要一个文件对象(类型为TextIOWrapper)才可以进行,如果要想获得此文件对象,则必须利用内置模块(builtins)中提供的open()函数完成。
open() 方法
Python open() 方法用于打开一个文件,并返回文件对象。
在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode='r')
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
- opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。
mode参数:
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
b | 二进制模式。 |
t | 文本模式 (默认)。 |
+ | 打开一个文件进行更新(可读可写)。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
2,文件读写
文件属性
file.closed | 关闭文件。关闭后文件不能再进行读写操作。 |
file.mode | 返回被打开文件的访问模式 |
file.name | 返回文件的的名称 |
file.write | 写入文件 |
file.readline | 读取整行,包括 "\n" 字符。 |
file.readlines | 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
file.writable | 判断文件是否可以写入 |
file.writelines | 写入一组数据 |
def main();
try:
file=open("d:\\info.txt","r")
file.write("hello word")
print("文件名称:%s" % file.name)
print("文件是否已关闭:%s" % file.closed)
print("文件访问模式:%s" % file.mode)
finally:
file.close()
print("调用close()方法后的关闭状态:%s" % file.closed)
if __name__=="__main__":
main()
try...finally...部分可以用下面的代码代替 :
with open(file="d:\\info.txt",mode="r"):
file.write("hello word")
print("文件名称:%s" % file.name)
print("文件是否已关闭:%s" % file.closed)
print("文件访问模式:%s" % file.mode)
读取文件内容
def main();
with open(file="d:\\info.txt",mode="r") as file:
val=file.readline()
while val:
print(val,end="")
val=file.readline()
if __name__=="__main__":
main()
def main();
with open(file="d:\\info.txt",mode="r") as file:
val=file.readline()
for line in file:
print(line,end="")
if __name__=="__main__":
main()
3,随机读取
1)seek() 方法用于移动文件读取指针到指定位置。
seek() 方法语法如下:
fileObject.seek(offset[, whence])
参数
-
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
-
whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
返回值
如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。
2)tell() 方法返回文件的当前位置,即文件指针当前位置。
tell() 方法语法如下:
fileObject.tell()
def main():
with open(file="d:\\info.txt",mode="r") as file:
file.seek(15)
print("当前文件位置:%s" % file.tell())
4,文件编码
在计算机的世界中,所有的显示文字都是按照一定的数字编码进行保存的,在以后进行程序的开发之中,会经常见到一些常见的编码:
ISO 8859-1:国际通用单字节编码,最多只能表示0-255的字符范围,主要在英文传输中使用。
GBK/GBK2312: 中文的国际编码,专门用来表示汉字,是双字节编码。GBK可以表示简体中文和繁体中文,GBK2312只能表示简体中文。
UNICODE:十六进制编码,可以准确地表示出世界上任何的文字信息,但是需要较大的存储空间。英文字母需要使用两个字节编码。
UTF编码:兼容了ISO 8859-1编码,同时也可以用来表示所有的语言字符,不过UTF编码是不定长编码,每一个字符的长度从1~6个字节不等,一般在中文网页中常用的是UTF-8编码,因为这种编码既可以节省空间又可以准确第描述文字信息。
检测文件编码类型
pip install chardet
import chardet
def detect_file_encoding(filename):
# 读取文件的一部分用于编码检测,以减少内存使用
with open(filename, 'rb') as f:
rawdata = f.read(1000) # 读取前1000个字节通常足够检测编码
result = chardet.detect(rawdata)
return result['encoding']
# 替换为你的文件名
filename = 'your_file.txt'
encoding = detect_file_encoding(filename)
print(f'Detected encoding: {encoding}')