Python对文件操作的流程
- 打开文件 得到文件句柄并赋值给一个变量
- 通过文件句柄对文件进行操作
- 关闭文件
关于关闭文件,Python解析器在写入文件时会将写入的内容放到内置的一个缓冲区中,在程序执行结束时会将缓冲区的数据写入到文件中。所以我们最好在操作完文件后调用close方法关闭文件,及时让改动生效
code
# 打开文件,得到文件句柄并赋值给一个变量
f = open('test', 'w', encoding='utf8')
# 操作文件
f.write('hello world')
# 关闭文件
f.close()
文件操作模式
- 在上面的文件操作中,创建操作对象的open方法中,会指定一个文件的打开模式w,Python还有其它的操作模式
r 读取
w 写入 打开写作,先截写文件 就是在打开文件后将文件的所有内容截断再重新写入文件内容
x 创建一个新的文件然后以写入的方式打开
a 以写入的方式打开,并且在文件的最后拼接内容
b 二进制
t text mode(文本模式 默认的)
- 打开一个磁盘文件,用于更新(读取和写入)
* r+ 读写模式 先读后写,会先将文件读到然后写到文件后面 光标起始位置在最开始
* w+ 写读模式 先写后读 会先以w打开文件就会情况文件全部的内容
* a+ 追加模式 (+可读) 光标起始位置在最后
* + 加上+意味着同时为输入和输出打开文件
U 通用换行模式(弃用)
文件对象方法
- readlines() 返回整个文件内容的列表
- read()
- tell() 返回文件内部索引指针当前的位置。
- 其中 英文数字占一个字符,中文占3个字符,注意此刻读出来的索引的位置和文件编码没有关系
- writelines(list) 把列表内所有字符串写入文件中
f = open('test', 'r+')
print(f.tell())
# f.write('hello yourself it\'test ')
# time.sleep(100)
# f.close()
print(f.read(2))
print(f.tell())
f.tell()
- seek 设置内部索引指针的位置
- flush 把输出缓冲区刷到硬盘中,但不关闭文件
- print(内容,结束,flush=True/False[是否即刻将缓冲区的内容刷新])
- truncate(count) count 默认 -1 截断:截取文件的指定内容,默认从最开始的位置截取所有内容
- with
为了避免打开文件后忘记关闭,可通过with进行管理
with.open('log','r') as f:
pass
当with代码执行完毕时候,内部会自动关闭并释放文件资源
在Py2.7后,with又支持同时对多个文件进行管理
with open('log1') as obj1,open('log2') as obj2:
pass
- 格式
with open(filepath1) as file对象...:
pass
with open('test', 'r', encoding='utf8') as file_read, open('56789', 'w', encoding='utf8') \
as file_write:
number = 0
for read_line in file_read:
number += 1
if number == 3:
read_line = ''.join([read_line.strip(), '王鑫\t', 'is Speaking\n'])
file_write.write(read_line)
Python的文件支持
- Python支持文本和二进制文件
- 文本文件把内容表示为常规的str字符串,自动执行Unicode编码和解码,并且默认执行末行转换
- 二进制文件把内容表示为一个特殊的bytes字符串类型,并且允许程序不修改地访问文件内容
在文件中存储并解析Python对象
- 文件数据在脚本中一定是字符串,而写入方法不会自动地替我们做任何向字符串格式转换的工作
X, Y, Z = 30, 25, 33
S = 'Span'
D = {'a': 1, 'b': 2}
L = {1, 2, 3}
F = open('writeFile.txt', 'w', encoding='utf8')
F.write(S + '\n')
F.write("%s,%s,%s\n" % (X, Y, Z))
F.write(str(L) + '$' + str(D) + '\n')
F.close()
- Python不会自动把字符串转换为数字或者其他类型的对象
eval函数
- eval是Python内置函数,eval能够把字符串当做可执行程序代码
# D = {'a': 1, 'b': 2}
# L = {1, 2, 3}
# F.write(str(L) + '$' + str(D) + '\n')
direc_file = readF.readline()
direc_splite = direc_file.split('$')
directs = [eval(P) for P in direc_splite]
print(directs)
# [{1, 2, 3}, {'a': 1, 'b': 2}]
用pickle 存储Python原生对象
- Pickle模块是能够让我们直接在文件中存储几乎任何Python对象的高级工具
import pickle
# 写入字典到文件
direct_a = {'a': 1, 'b': 2, 'c': 3}
F = open('pickleFile.txt', 'wb')
pickle.dump(direct_a, F)
F.close()
# 从文件取回字典
read_file = open('pickleFile.txt','rb')
direct_b = pickle.load(read_file)
print(direct_b)
# 输出
# {'a': 1, 'b': 2, 'c': 3}
- pickle在内部将字典转成字符串形式
- 在Python3.0 中 pickle化的对象的文件总是二进制的。因为pickle程序创建和使用一个bytes字符串对象。