应用程序运行过程中产生的数据最先都是存放于内存中的,若想永久保存下来,必须要保存于硬盘中。应用程序若想操作硬件必须通过操作系统,而文件就是操作系统提供给应用程序来操作硬盘的虚拟概念,用户或应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统完成对硬盘的具体操作。
.txt和没有后缀名的文件
有了numpy、pandas等模块就可以操作word、Excel、PPT等文件
Python文件处理主要涉及到打开文件、读取文件内容、写入文件内容、关闭文件等操作。可以使用内置的open()函数打开文件并获取文件对象,然后就可以对文件进行读写等操作。
"""
三步法:
1.打开文件
2.读或写
3.关闭文件
"""
使用open()
函数时需要指定文件名和打开方式,常见的打开方式有以下几种:
‘r’:只读方式打开文件,可以读取文件内容,不能够修改文件。
‘w’:写入方式打开文件,如果文件已存在内容,则会覆盖内容,然后写入新的内容;如果文件不存在,则会新建一个文件并写入内容。
‘a’:追加的方式打开文件,如果文件已存在内容,则会在文件内容末尾追加新内容;如果文件不存在,则会新建一个文件并写入内容。
open(‘要操作的文件路径’, ‘读写模式’, ‘字符编码’)
'D:\Python27\day10\a.txt'
# 当路径中出现了字母和斜杠的组合会产生一些特殊的含义,所以我们应该给去掉:
r'D:\Python27\day10\a.txt'
# 在前面加上r
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'>
# helloworld
print(f.read()) # 类似于是文件的内置方法
f.close()
另外,还可以使用with语句来打开文件,这样可以确保在使用结束后自动关闭文件,例如:
with open('file.txt', 'r' encoding = 'UTF-8') as f:
content = f.read()
print(content)
当文件路径不存在是,会直接报错
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())
当文件路径不存在的时候, 会新建出来一个文件,而不报错但是会把以前的数据覆盖掉
with open('a.txt', 'w', encoding = 'UTF-8')as f:
f.write('hellow')
f.write('world')
f.write('jerry')
当路径不存在的时候,也会新建出来文件,它的写的内容不是覆盖而是追加
with open('a.txt', 'a', encoding = 'UFT-8') as f:
f.write('hellow1')
f.write('hellow2')
f.write('hellow3')
f.write('hellow4')
f.write('hellow5')
with open('a.txt', 'r', encoding = 'UTF-8') as f:
print(f.read()) # read方法是一次性读取文件中所有数据
print(f.readline()) # readline一次读取一行内容
print(f.readlines()) # readlines一次读取所有内容,然后把每一行内容作为列表的一个元素返回,返回的数据类型就是列表
print(f.readable()) # readable判断文件是否可读
with open('a.txt', 'w', encoding = 'UTF-8') as f:
print(f.write('123', 'kevin', '321'))
print(f.writelines(['123\n', 'keinv\n', '321\n'])) # 写入多行数据,并换行
print(f.writeable) # 同只读一样
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() # 把数据从内存中立刻刷到磁盘
"""
当你读取的数据比较小的时候,其实是在缓冲区的,当数据量够多的时候,它会一定刷到磁盘
"""
"""
一次性读取文件的所有数据有什么问题:
当数据比较多的时候,会出现内存溢出,这种情况是坚决不能出现的
如何优化以上操作:
一点一点的读取数据然后把数据赶紧刷到硬盘里
"""
t: text # r w a ------>>>rt wt at
with open('a.txt', 'r', encoding='utf-8') as f:
#文本模式默认就是操作字符串
#文本特征:
#1. encoding参数必须指定
#2. 读取的所有的数据都是以字符串为单位的
#3. t模式只能够读取文本或者字符模式
b模式:binary
with open('a.txt', 'ab')as f:
#b模式中b不能省略----------->>> ab wb ab
#特征:
#1.encoding='utf-8'参数不能够指定
#2. 读取的数据全部以字节为单位
#3. 二进制模式可以读取任意类型的文件
t模式:
with open('a.txt', 'rt', encoding = 'UTF-8')as f:
print(f.read(5))
f.read()不指定参数,默认读取所有数据
f.read(5)指定了参数,返回的就是字符个数
b模式:
with open('a.txt', 'rb') as f:
print(f.read(5).decode('UTF-8'))
f.read(5)指定了参数那么返回的就是字节个数,如果有中文字符存在,就是按照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(9)
f.write('<妇女主任>')
mode='r+'
mode='w+t'
mode='a+t'
# 可读可写
# 可读可写
# 可读可写
1. 硬盘中得数据是不允许直接修改的
2. 内存中得数据是可以直接修改的
'''方式一:'''
# 1. 读取文件内的所有数据
# 快捷键:shift+enter
with open('a.txt', 'r', encoding='utf-8') as f:
data = f.read()
print(data)
# 2. 读取完字符之后,做字符替换
with open('a.txt', 'wt', encoding='utf-8') as f:
f.write(data.replace('kevin', 'kevinSB'))
'''方式2:'''
import os
with open('a.txt',mode='rt',encoding='utf-8') as read_f, \
open('.a.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('SB','kevin'))
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')