1.我们可以操作的文件类型:.txt,和没有后缀名的文件。
2.我们现在不能操作的文件类型:word,Excel,ppt等类型文件
numpy,pandas 等模块可以操作。
1:打开文件(open)使用open()函数打开文件,并指定文件名和打开模式(读、写、追加等)
2:读或写 使用write()函数或writelines()函数来写入文件内容。
3:关闭文件 使用close()函数关闭文件,释放文件资源。
open("要操作的文件路径",‘读写模式’,字符编码)
文件的路径又分为:相对路径和绝对路径
注:当路径中出现了字母和\斜杠的组合的时候,会产生一些特殊的含义,所以当我们在编写路径时,应该给它去掉。
f= open(r'D:\Python27\day10\a.txt', 'r', encoding='utf-8') # \n \t
# 返回的是文件句柄
print(f)
# <_io.TextIOWrapper name='D:\\Python27\\day10\\a.txt' mode='r' encoding='utf-8'>
with open('a.txt','r',encoding='utf8') as f:
print(f.read()) #12354
open(文件路径,读写模式,字符编码)
文件路径:是必须要写的
书写模式:也是必须要写的
字符编码:可选的
分为“r”,"w","a"
r:只是读取,不能写
w:只能写,不能读
a:在原来的基础上追加内容
1.只能读 r
f = open('b.txt', 'r', encoding='utf-8') # No such file or directory: 'b.txt'
f = open('a.txt', 'r', encoding='utf-8') # No such file or directory: 'b.txt'
print(f.read())
f.close()
with open('a.txt', 'r', encoding='utf-8') as f:
print(f.read())
2.只能写 w
写模式的特征:
1.当文件不存在时,会新建一个文件,不会报错
2.写模式会把原来文件里的数据给覆盖掉,书写时要注意,不建议使用w写模式
with open('b.txt', 'w', encoding='utf-8') as f:
# pass # 为了不全语法结构
# f.write('hello')
# f.write('hahahahhah')
f.write('jerry')
3.追加模式 a
追加模式:没有该文件也会和w写模式一样,会重新新建一个文件,但他是追加写入,并不会覆盖原来的内容。
with open('c.txt', 'a', encoding='utf-8') as f:
f.write('hello world')
f.write('hello world1')
f.write('hello world2')
with open('a.txt', 'r', encoding='utf-8') as f:
# print(f.read()) # read方法是一次性读取文件中得所有数据
# print(f.readline()) # helloworld1
# print(f.readline()) # readline一次只读文件的一行内容
# print(f.readlines()) # 一次性读取文件的所有内容,然后每一个内容作为列表的一个元素返回,返回的数据类型是:列表
print(f.readable()) # able ation un multi ...
with open('a.txt', 'w', encoding='utf-8') as f:
# f.write('jerry say hello ')
# f.writelines(['hello\n', 'jerry\n', 'kevin\n', 'jason\n'])
print(f.writable())
print(f.readable())
with open('a.txt', 'r', encoding='utf-8') as f:
# print(f.read()) # 一次性读取文件的所有数据,并且光标在文件的末尾,如果在去读,就读不到了
# print(f.read())
# 文件句柄f是支持for循环的
for line in f:
# line: 就是文件的一行内容
print(line)
# 了解的方法:
# f.flush() # 把数据从内存中立刻刷到磁盘
注:当你读取的数据比较小的时候,其实是在缓冲区的,当数据量够多的时候,它会一定刷到磁盘。一次性读取文件的所有数据有什么问题:
当数据比较多的时候,会出现内存溢出,这种情况是坚决不能出现的
如何优化以上操作:
一点一点的读取数据然后把数据赶紧刷到硬盘里
with open('a.txt', 'r', encoding='utf-8') as f:
print(f.read(5))
with open('a.txt', 'rb') as f:
print(f.read().decode('utf-8')) # b'helloworld'
print(f.read(7).decode('utf-8')) # b'helloworld'
t模式:
f.read()如果不指定参数,默认情况下是一次性读取所有
f.read(5)如果指定了参数,返回的就是字符个数
b模式:
f.read()如果指定了参数,返回的就是字节数,如果文件中有中文字符,那么要书写的就是3的倍数,如果有中文也有英文的话,就得重新计算。
指针:可以理解为光标的移动
with open('a.txt', 'r', encoding='utf-8') as f:
print(f.read(5)) # 你helloworld
f.seek(3, 1)
print(f.read())
# print(f.read(5))
# print(f.read())
with open('a.txt', 'rb') as f:
print(f.read(2)) # helloworld
f.seek(-3, 2)
print(f.read())
# print(f.read(5))
# print(f.read())
f.seek()
offset:int:代表的是移动的偏移量,如果是正数就是往右移,如果是负数就是往左移
whence:int=0代表的是模式】
控制模式:
0:默认模式,该模式代表指针移动的字节数是以文件的开头为参考,它能够使用在t和b模式。
1.该模式代表指针移动的字节数是以当前所在的位置为参考的,只支持b模式(二进制),t模式不可以
2.该模式是代表指针移动的字节是以文件的末尾为参考。
五.文件的修改:
with open('a.txt',mode='r+t',encoding='utf-8') as f:
f.seek(5)
f.write('哈哈')
##hello哈哈好
mode = +r mode=w+t mode=a+t 都是可读可写
注:硬盘当中的数据是不允许直接修改的,内存中得到的数据是可以修改的
读取文件中所有的数据:
#读取文件中所有的信息
with open('a.txt',mode='r', encoding='utf-8') as f:
date = f.read()
print(date)
#读取完之后,做字符替换
with open('a.txt',mode='wt',encoding='utf-8') as f:
f.write(date.replace('哈哈', '不好'))