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\n222\n') #针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.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()ifline:
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 info.readlines():
print(line)
fo.close()

分行读入,逐行处理:

fo = open(fname,"r")for line info:
print(line)
fo.close()

数据文件的写入:

fo = open("output.txt","w+")
ls= ["China", "France", "America"]
fo.writelines(ls)
fo.seek(0)for line info:
print(line)
fo.close()