博客简介
这篇博客详细介绍了Python中的文件流的创建和使用方法:
- 使用open() 方法打开一个文件
- file对象的函数方法
使用open() 方法打开一个文件
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError,使用方法如下:
- 常用形式:
open(file, mode='r')
- 全部参数:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数 | 含义 | 是否可选 |
---|---|---|
file | 文件路径(相对或者绝对路径) | 必选 |
mode | 文件打开模式 | 可选 |
buffering | 设置缓冲 | 可选 |
encoding | 一般使用utf8 | 可选 |
errors | 报错级别 | 可选 |
newline | 区分换行符 | 可选 |
closefd | 传入的file参数类型 | 可选 |
- mode参数,对应不同的打开方式,mode的取值如下:
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(Python 3 不支持)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
-
用流程图来描述:
-
使用举例:
打开一个名为test.txt的文本文件,写入字符串:
#!/usr/bin/python3
#coding=gbk
f=open('test.txt','w')
f.write("C C++ Java Python HTML CSS javaScript");
f.close()
#C C++ Java Python HTML CSS javaScript
file对象的函数方法
file 对象使用 open 函数来创建,使用file对象的方法才能真正获取对象的能力,下表列出了 file 对象常用的函数:
序号 | 方法及描述 |
---|---|
1 | file.close() 关闭文件。关闭后文件不能再进行读写操作。 |
2 | file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 | file.next() Python 3 中的 File 对象不支持 next() 方法。 返回文件下一行。 |
6 | file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | file.readline([size]) 读取整行,包括 "\n" 字符。 |
8 | file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
9 | file.seek(offset[, whence]) 移动文件读取指针到指定位置 |
10 | file.tell() 返回文件当前位置。 |
11 | file.truncate([size]) 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 |
12 | file.write(str) 将字符串写入文件,返回的是写入的字符长度。 |
13 | file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
举例
(1)打开一个数字字符串文件将数字字符串转换为数字列表
下面我们从一个数据文件中读取所有的数字,并且将每一个数字存储在一个列表中:
- 用file对象的read方法读取所有的字符,返回一个字符串
- 将换行符用replace方法替换成空格
- 用split方法将字符串分割成数字字符串
- 用int强制转化成数字
#!/usr/binpython3
#coding=gbk
f=open('number.txt','r')
#读取所有行,返回一个字符串list
number=[]
#去掉两端空行
txt=f.read().strip()
#将换行替换成空格
txt=txt.replace('\n',' ')
number=txt.split(' ')
print(number)
for x in number:
if(len(x)>0):print(int(x),end=' ')
f.close()
源文件:
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30
输出结果:
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '']
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
另外一种方法是:
number=[]
for line in f:
number+=line[:-1].strip(' ').split(' ')
for x in number:
if(len(x)>0):print(int(x),end=' ')
f.close()
'''
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
'''
(2)从一个文件中读取文件并且输出为另一个文件
#coding=gbk
def main():
f1=input("请输入要读取的文件名")
f2=input("请输入要写入的文件名")
infile=open(f1,'r')
outfile=open(f2,'w')
coutLines=countChars=0
for line in infile:
coutLines+=1
countChars+=len(line)
outfile.write(line)
print("countLines:{}\ncoutnChars:{}".format(coutLines,countChars))
infile.close()
outfile.close()
main()
read.txt
Hello World!
Yes,that's ok
No, I am not ready yeat
Python
Java
C++
Javascript
write.txt
Hello World!
Yes,that's ok
No, I am not ready yeat
Python
Java
C++
Javascript
(3)合并电话薄和邮箱薄:
#coding=gbk
#利用字符串和列表将两个通讯录文本合并为一个文本
def main():
ftele1=open('TeleAddressBook.txt','rb')
ftele2=open('EmailAddressBook.txt','rb')
ftele1.readline()#跳过第一行
ftele2.readline()
lines1 = ftele1.readlines()
lines2 = ftele2.readlines()
list1_name = []
list1_tele = []
list2_name = []
list2_email = []
for line in lines1:#获取第一个文本中的姓名和电话信息
elements = line.split()
list1_name.append(str(elements[0].decode('gbk')))
list1_tele.append(str(elements[1].decode('gbk'))) #将文本读出来的bytes转换为str类型
for line in lines2:#获取第二个文本中的姓名和邮件信息
elements = line.split()
list2_name.append(str(elements[0].decode('gbk')))
list2_email.append(str(elements[1].decode('gbk')))
###开始处理###
lines = []
lines.append('姓名\t 电话 \t 邮箱\n')
#按索引方式遍历姓名列表1
for i in range(len(list1_name)):
s= ''
if list1_name[i] in list2_name:
j = list2_name.index(list1_name[i]) #找到姓名列表1对应列表2中的姓名索引位置
s = '\t'.join([list1_name[i], list1_tele[i], list2_email[j]])
s += '\n'
else:
s = '\t'.join([list1_name[i], list1_tele[i], str(' ----- ')])
s += '\n'
lines.append(s)
#处理姓名列表2中剩余的姓名
for i in range(len(list2_name)):
s= ''
if list2_name[i] not in list1_name:
s = '\t'.join([list2_name[i], str(' ----- '), list2_email[i]])
s += '\n'
lines.append(s)
ftele3 = open('AddressBook.txt', 'w')
ftele3.writelines(lines)
ftele3.close()
ftele1.close()
ftele2.close()
print("The addressBooks are merged!")
if __name__ == "__main__":
main()
(4)从文本中读取参数绘制turtle图形,数据驱动的图形绘制
- 从一个文件中读取数据
- 根据读入的数据绘制图形
#coding=gbk
import turtle
def main():
turtle.title("数据驱动的动态路径绘制")
turtle.setup(800,600,0,0)
pen=turtle.Turtle()
pen.color('red')
pen.width(5)
pen.shape('turtle')
pen.speed(3)
res=[]
file=open('data.txt')
file.readline()
for line in file:
res.append(list(map(float,line[:-1].split(','))))
print(res)
for i in range(len(res)):
pen.color(res[i][3],res[i][4],res[i][5])
pen.forward(res[i][0])
if(res[i][1]):
pen.rt(res[i][2])
else:
pen.lt(res[i][2])
pen.goto(0,0)
turtle.done()
main()
data.txt:
前进的距离,转动方向,转动角度,rgb颜色值
300,0,144,1,0,0
300,0,144,0,1,0
300,0,144,0,0,1
300,0,141,1,0,0
300,0,108,0,1,1
184,0,72,1,0,1
184,0,72,0,0,0
184,0,72,0,0,0
184,0,72,0,0,0