文件流Python

博客简介

这篇博客详细介绍了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

在这里插入图片描述

发布了191 篇原创文章 · 获赞 377 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_44307065/article/details/104580621