一、读和写文件
open(filename, mode, buffering, encoding)
filename : filename 变量是一个包含了你要访问的文件名称的字符串值。
mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
buffering :读取缓冲区大小(读取大文件的时候推荐使用,避免对内存造成压力)
encoding : 指定文件的编码
模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。
如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。
如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
二、读取一个文件
# 读取一个文本
file = open("d:/哈哈.txt","r")
# 1.读取整个文本内容
context = file.read()
print(context)
# 2.读取一行
line = file.readline()
while (line != ""):
print("行:", line)
line = file.readline()
# 3.读取所有行
lines = file.readlines()
for line in lines :
print(line)
# 4.直接迭代整个文件获得文本信息
for line in file :
print(line)
# 5.关闭资源
file.close();
三、创建并写一个文件
file = open("d:/2.txt","w")
context = "haha/n你妈的/nasdasd/n112额2/n"
# 1.写入信息,返回写入信息的字符的长度
num = file.write(context)
# 2.关闭资源
file.close()
四、文件指针
f = open("d:/2.txt","r+")
1.f.tell()指针当前位置
2.f.seek()改变指针的位置
用法:
seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
seek(x,1) : 表示从当前位置往后移动x个字符
seek(-x,2):表示从文件的结尾往前移动x个字符
五、关闭文件
1.文件关闭后,文件资源被释放,之后不能继续操作
2.手动关闭
file = open()
file.close()
3.自动关闭。 而且写起来也比 try - finally 语句块要简短
with open() as file:
file.read()
六、Python对象序列化
python的pickle模块实现了基本的数据序列和反序列化。
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
1.序列化
import pickle
map = {'k1':1 , 'k2':2 , 'k3':3 , 'k4':4 , 'k5':"啥?" }
list = [1, 2, 3, 5, 6]
# 创建一个文件
out = open('d:/data.pkl', 'wb')
# 保存一个对象
pickle.dump(map, out)
# 保存一个对象
pickle.dump(list, out)
out.close()
2.反序列化
# 读取序列化文件
input = open('d:/data.pkl', 'rb')
# 读一个对象 ==>map
data1 = pickle.load(input)
# 读一个对象 ==>list
data2 = pickle.load(input)
input.close()
七、内置file对象函数
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:
方法 描述
file.close() 关闭文件。关闭后文件不能再进行读写操作。
file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。
file.next() 返回文件下一行。
file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。
file.readline([size]) 读取整行,包括 "\n" 字符。
file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大,
因为需要填充缓冲区。
file.seek(offset[, whence]) 设置文件当前位置
file.tell() 返回文件当前位置。
file.truncate([size]) 截取文件,截取的字节通过size指定,默认为当前文件位置。
file.write(str) 将字符串写入文件,没有返回值。
file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
八、os模块
import os
filePath = "D:/2.txt"
dirPath = "D:/xwyl"
####################### 一、检验权限模式 #########################
# 1.文件/文件夹是否存在
access1 = os.access(filePath, os.F_OK)
print(access1)
# 2.文件/文件夹是否可读
access2 = os.access(filePath, os.R_OK)
print(access2)
# 3.文件/文件夹是否可写
access3 = os.access(filePath, os.W_OK )
print(access3)
# 4.文件/文件夹是否可执行
access4 = os.access(filePath, os.X_OK)
print(access4)
####################### 二、改变当前工作目录 #########################
print ("当前工作目录为 %s" % os.getcwd())
# 修改当前工作目录
os.chdir( dirPath )
# 查看修改后的工作目录
print ("目录修改成功 %s" % os.getcwd())
####################### 三、更改文件或目录的权限 #########################
import stat
os.chmod(dirPath, stat.S_IWRITE)
# stat.S_IXOTH: 其他用户有执行权0o001
# stat.S_IWOTH: 其他用户有写权限0o002
# stat.S_IROTH: 其他用户有读权限0o004
# stat.S_IRWXO: 其他用户有全部权限(权限掩码)0o007
# stat.S_IXGRP: 组用户有执行权限0o010
# stat.S_IWGRP: 组用户有写权限0o020
# stat.S_IRGRP: 组用户有读权限0o040
# stat.S_IRWXG: 组用户有全部权限(权限掩码)0o070
# stat.S_IXUSR: 拥有者具有执行权限0o100
# stat.S_IWUSR: 拥有者具有写权限0o200
# stat.S_IRUSR: 拥有者具有读权限0o400
# stat.S_IRWXU: 拥有者有全部权限(权限掩码)0o700
# stat.S_ISVTX: 目录里文件目录只有拥有者才可删除更改0o1000
# stat.S_ISGID: 执行此文件其进程有效组为文件所在组0o2000
# stat.S_ISUID: 执行此文件其进程有效用户为文件所有者0o4000
# stat.S_IREAD: windows下设为只读
# stat.S_IWRITE: windows下取消只读
####################### 四、方法用于更改文件所有者 #########################
# 如果不修改可以设置为 -1, 你需要超级用户权限来执行权限修改操作。只支持在 Unix 下使用。
# os.chown(path, uid, gid)
# path -- 设置权限的文件路径
# uid -- 所属用户 ID
# gid -- 所属用户组 ID
####################### 五、更改当前进程的根目录为指定的目录,使用该函数需要管理员权限 #########################
# os.chroot("/tmp")
####################### 六、递归文件夹创建函数 #########################
path = "d:/tmp/home/monthly/daily"
os.makedirs( path, mode=0o777);
####################### 七、删除 #########################
# 删除文件
os.remove("文件路径")
# 递归删除目录
os.removedirs("文件夹路径")
# 删除path指定的空目录,如果目录非空,则抛出一个OSError异常。
os.rmdir(path)
####################### 八、修改 #########################
# 重命名文件或目录,从 src 到 dst
# os.rename(src, dst)
# 递归地对目录进行更名,也可以对文件进行更名。
# os.renames(old, new)
####################### 九、基本信息 #########################
#显示文件的 stat 信息
stinfo = os.stat('a2.py')
# 使用 os.stat 来接收文件的访问和修改时间
print ("a2.py 的访问时间: %s" %stinfo.st_atime)
print ("a2.py 的修改时间: %s" %stinfo.st_mtime)
# 修改访问和修改时间
os.utime("a2.py", (1330712280, 1330712292) )
九、shutil
日常的文件和目录管理任务,:mod:shutil 模块提供了一个易于使用的高级接口:
import shutil
# 复制问阿金
shutil.copyfile('data.db', 'archive.db')
# 移动文件
shutil.move('/build/executables', 'installdir')
十、glob
glob模块提供了一个函数用于从目录通配符搜索中生成文件列表:
import glob
#获取所有文件名的列表
l1 = glob.glob("D:/台风/*")
#获取所有jpg名的列表
l2 = glob.glob("D:/台风/*.jpg")
#获取符合正则表达式的文件名的列表
l3 = glob.glob("D:/台风/[0-9]{0, 10}.jpg")
十一、StringIO
很多时候,数据读写不一定是文件,也可以在内存中读写。 StringIO顾名思义就是在内存中读写str。 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:
>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!
getvalue()方法用于获得写入后的str。 要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取:
>>> from io import StringIO
>>> f = StringIO('Hello!\nHi!\nGoodbye!')
>>> while True:
... s = f.readline()
... if s == '':
... break
... print(s.strip())
...
Hello!
Hi!
Goodbye!
十二、BytesIO
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。 BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes:
>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'
请注意,写入的不是str,而是经过UTF-8编码的bytes。 和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取:
>>> from io import BytesIO
>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
>>> f.read()
b'\xe4\xb8\xad\xe6\x96\x87'
StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。
文章信息
- 本文作者:zhangxue
- 本文链接:https://lucksnow1989.github.io/article/13.脚本语言/python/基本语法/8文件.html
- 版权声明:本文为本人原创文章,遵循 CC 4.0 BY-NC-SA版权协议,转载请附上原文出处链接和本声明。