python中的文件操作: 包括文件的打开方式和文件的修改
python 文件操作:
文件一般分为文本文件和二进制文件。
文本文件:
由单一特定编码组成的文件,如UTF-8编码
由于存在编码,也被看成是存储着的长字符串
适用于例如:.txt文件、.py文件等
二进制文件:
直接由比特0和1组成,没有统一字符编码
一般存在二进制0和1的组织结构,即文件格式
适用于例如:.png文件、.avi文件等
正常的文件操作都分三步走:
打开文件
操作文件
关闭文件
# 1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
文件的打开模式:
variety | meaning |
'r' | 只读模式,默认值,如果文件不存在,返回输出异常 |
'w' | 覆盖写模式,文件不存在则创建,存在则完全覆盖 |
'x' | 创建写模式,文件不存在则创建,存在则返回FileExistsError |
‘a’ | 追加写模式,文件不存在则创建,存在则在文件最后追加内容 |
‘b’ | 二进制文件模式 |
‘t’ | 文本文件模式,默认值 |
‘+’ | 与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】
#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作
(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、
图片文件的jgp格式、视频文件的avi格式)
rb
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
文件内容的读取:
variety | meaning |
f.read(size=-1) | 读入全部内容,如果给出参数,读入前size长度 |
f.readline(size=-1) | 读入一行内容,如果给出参数,读入该行前size长度 |
f.readlines(hint=-1) | 读入文件所有行,以每行为元素形成列表,如果给出参数,读入前hint行 |
f.write(s) | 向文件写入一个字符串或字节流 |
f.writelines(lines) | 将一个元素全为字符串的列表写入文件 |
f.seek(offset) | 改变当前文件操作指针的位置,offset含义如下:0 – 文件开头; 1 – 当前位置; 2 – 文件结尾 |
#掌握
.read() #读取所有内容,光标移动到文件末尾 f.readline() #读取一行内容,光标移动到第二行首部 f.readlines() #读取每一行内容,存放于列表中 f.write('1111 222 ') #针对文本模式的写,需要自己写换行符 f.write('1111 222 '.encode('utf-8')) #针对b模式的写,需要自己写换行符 f.writelines(['333 ','444 ']) #文件模式 f.writelines([bytes('333 ',encoding='utf-8'),'444 '.encode('utf-8')]) #b模式
python2中的file与open:
#首先在python3中操作文件只有一种选择,那就是open() #而在python2中则有两种方式:file()与open() 两者都能够打开文件,对文件进行操作,也具有相似的用法和参数,
但是,这两种文件打开方式有本质的区别,file为文件类,用file()来打开文件,
相当于这是在构造文件类,而用open()打开文件,是用python的内建函数来操作,
我们一般使用open()打开文件进行操作,而用file当做一个类型,比如type(f) is file
文件内光标的移动:
# read(3):
# 1. 文件打开方式为文本模式时,代表读取3个字符
# 2. 文件打开方式为b模式时,代表读取3个字节
#二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
#注意:
# 1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,#都是以bytes为单位移动的
# 2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式#打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
import time
with open('test.txt','rb') as f:
f.seek(0,2)
while True:
line=f.readline()
if line:
print(line.decode('utf-8'))
else:
time.sleep(0.2)
文件的修改:
一次读入,统一处理
fo = open(fname,"r")
txt = fo.read()
...#对全文txt进行处理
fo.close()
按数量读入,逐步处理:
fo = open(fname,"r")
txt = fo.read(2)
while txt != "":
#对txt进行处理
txt = fo.read(2)
fo.close()
一次读入,分行处理:
fo = open(fname,"r")
for line in fo.readlines():
print(line)
fo.close()
分行读入,逐行处理:
fo = open(fname,"r")
for line in fo:
print(line)
fo.close()
数据文件的写入:
fo = open("output.txt","w+")
ls = ["China", "France", "America"]
fo.writelines(ls)
fo.seek(0)
for line in fo:
print(line)
fo.close()