查看所有Python相关学习笔记
本篇内容用于记录学习过程中接触到的读写文件相关操作
File(文件) 方法
阅读参考2:操作文件和目录(os)
交互学习:Python学习-文件系统
输入和输出
每次打开文件要记得关闭
- 原始方法
>>>f = open('/path/to/file', 'r')
>>>print(f.read())
>>>f.close()
- try...finally方法
>>>try:
>>> f = open('/path/to/file', 'r')
>>> print(f.read())
>>>finally:
>>> if f:
>>> f.close()
- with方法(自动调用close方法,支持打开多个文件,不用单独考虑close的问题)
>>>with open('/path/to/file', 'r') as f:
>>> print(f.read())
>>>with open('abc.txt') as a, open('bcd.txt','w') as b:
>>> f1 = a.read()
>>> f2 = b.write('hhh')
打开读文件
f=open('C:/Users/Administrator/Desktop/tmp/foo.txt','r')
f=open('C:/Users/Administrator/Desktop/tmp/foo.txt')
- 直接获取
打开文件后可以直接通过for循环读取内容,每循环一次读一行
with open(r'E:\tmp\hello.txt') as f:
for one in f:
print(one)
# 执行结果
1111
2222
333
- read() 从读取所有内容(读取后,指针位置移动到最后)
with open(r'E:\Python\tmp\own\hello.txt','r+') as f:
print(f'指针位置:{f.tell()}')
print(f.read()) #读取内容
print(f'指针位置:{f.tell()}')
# 执行结果:
指针位置:0
111
222
333
指针位置:13
- readline() 一行一行读取(每次读取后,指针位置移动到下一行)
with open(r'E:\Python\tmp\own\hello.txt','r+') as f:
print(f'指针位置:{f.tell()}')
print(f.readline()) #一行一行读取
print(f'指针位置:{f.tell()}')
print(f.readline()) # 一行一行读取
print(f'指针位置:{f.tell()}')
print(f.readline()) # 一行一行读取
print(f'指针位置:{f.tell()}')
# 执行结果
指针位置:0
111
指针位置:5
222
指针位置:10
333
指针位置:13
- readlines() 读取所有行并存入一个列表中(每次读取后,指针位置移动到最后)
with open(r'E:\Python\tmp\own\hello.txt','r+') as f:
print(f'指针位置:{f.tell()}')
print(f.readlines()) #读取所有行并存入一个列表中
print(f'指针位置:{f.tell()}')
# 执行结果:
指针位置:0
['111\n', '222\n', '333']
指针位置:13
打开写文件
覆盖原来的内容或新建文档
f=open('C:/Users/Administrator/Desktop/tmp/foo.txt','w')
打开写文件
接着原来的内容写或新建文档
f=open('C:/Users/Administrator/Desktop/tmp/foo.txt','a')
写示例
#打开文件,注意转译符,可在路径前加r
f=open(r'C:/Users/Administrator/Desktop/tmp/foo.txt','r+')
#写入内容
f.write('''hasen1.............
hasen2..............
hasen3...............
hasen4***********
''')
str = f.read()
print(str)
#关闭文件
f.close()
打开二进制文件
要读取二进制文件,比如图片、视频等等,用'rb'模式打开文件即可
>>> f = open('/Users/michael/test.jpg', 'rb')
>>> f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
写入二进制文件(用'wb')
未调用close()时由于缓存机制,写的内容不会立即写入到文件,此时可以使用flush()方法,将内容强制写入文件。
f = open('abc.txt','w') #打开文件
f.write('abcdefg') #写入内容
f.flush() #强制写入文件
示例
# 将一个文件中的内容复制到另一个文件
f=open('C:/Users/Administrator/Desktop/tmp/foo.txt')
copy = f.read()
f.close()
print()
print(copy)
f2 = open('C:/Users/Administrator/Desktop/tmp/copy.txt','a')
f2.write('\n'+copy)
f2.close()
f3 = open('C:/Users/Administrator/Desktop/tmp/copy.txt')
copy2 = f3.read()
f3.close()
print('..................')
print(copy2)
tell 当前指针位置
>>>fh = open('abc.txt')
>>>fh.tell()
0
seek 移动指针
seek() 方法用于移动文件读取指针到指定位置。
- 语法
fileObject.seek(offset[, whence])
- offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
- whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
>>>fh = open('abc.txt')
>>>fh.tell()
0
>>>fh.seek(0) # 从0开始移动0位-->相当于返回到开始位置
>>>fh.tell()
0
>>>fh.seek(2) #从开始位置向后移动两个位置
>>>fh.tell()
2
>>>fh.seek(2,0) #0-从开始位置向后移动两个位置
>>>fh.tell()
2
>>>fh.seek(2,1) #1-从当前位置向后移动两个位置
>>>fh.tell()
4
>>>fh.seek(-2,2) #2-从结束位置向前移动两位
>>>fh.tell()
永久存储:
- pickle模块
- 存放:pickling
- 读取:unpickling
以往存入文件中的都是str格式,读出来后也是str格式
pickle以二进制格式存入,读取出来后还是原文件的格式(字典/列表等)
- pickle.dump(a,b)
将a存入b
- pickle.load(b)
从b中读取
import pickle
my_list = [1,2,3,4]
pickle_file = open('my_list.pkl','wb') # 以二进制写的方式打开文件
pickle.dump(my_list,pickle_file) # 将列表存入文件
pickle_file.close() # 关闭文件
pickle_file = open('my_list.pkl','rb') # 以二进制读的方式打开文件
my_list2 = pickle.load(pickle_file) # 以列表形式读取文件
pickle_file.close()
print(my_list2)
# 执行结果
[1, 2, 3, 4]
文件的打开模式和文件对象方法
文件打开模式
打开模式 | 执行操作 |
---|---|
'r' | 以只读方式打开文件(默认) |
'w' | 以写入的方式打开文件,会覆盖已存在的文件 |
'x' | 如果文件已经存在,使用此模式打开将引发异常 |
'a' | 以写入模式打开,如果文件存在,则在末尾追加写入 |
'b' | 以二进制模式打开文件 |
't' | 以文本模式打开(默认) |
'+' | 可读写模式(可添加到其他模式中使用) |
'U' | 通用换行符支持 |
文件对象方法
打开模式 | 执行操作 |
---|---|
文件对象方法 | 执行操作 |
f.close() | 关闭文件 |
f.read([size=-1]) | 从文件读取size个字符,当未给定size或给定负值的时候,读取剩余的所有字符,然后作为字符串返回 |
f.readline([size=-1]) | 从文件中读取并返回一行(包括行结束符),如果有size有定义则返回size个字符 |
f.readlines() | 读取所有行,将所有行以列表形式存储 |
f.write(str) | 将字符串str写入文件 |
f.writelines(seq) | 向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象 |
f.seek(offset, from) | 在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节 |
f.tell() | 返回当前在文件中的位置 |
f.truncate([size=file.tell()]) | 截取文件到size个字节,默认是截取到文件指针当前位置 |