Python file"文件"常用方法(三):读+写+刷新

您所在的位置:网站首页 pop会员最低多少钱 Python file"文件"常用方法(三):读+写+刷新

Python file"文件"常用方法(三):读+写+刷新

2024-01-10 12:53| 来源: 网络整理| 查看: 265

一、write()方法 将字符串写入文件,返回的是写入的字符长度。

write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字|。

在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。

write()方法不会在字符串的结尾添加换行符(’\n’):

如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not ‘str’。

语法:

fileObject.write( [ string ])

参数

string – 要写入到已打开文件的内容。

返回值

返回的是写入的字符长度。

例子:

#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开一个文件 fo = open("foo.txt", "w") fo.write( "www.runoob.com!\nVery good site!\n") # 关闭打开的文件 fo.close() 上述方法会创建foo.txt文件,并将收到的内容写入该文件,并最终关闭文件。如果你打开这个文件,将看到以下内容: $ cat foo.txt www.runoob.com! Very good site!

二、writelines() 方法: 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

writelines() 方法用于向文件中写入一序列的字符串。这一序列字符串可以是由迭代对象产生的,如一个字符串列表。换行需要制定换行符 \n。

语法

fileObject.writelines( [ str ])

参数

str – 要写入文件的字符串序列。

返回值

该方法没有返回值。

实例 以下实例演示了 writelines() 方法的使用:

#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开文件 fo = open("test.txt", "w") print ("文件名为: ", fo.name) seq = ["菜鸟教程 1\n", "菜鸟教程 2"] fo.writelines( seq ) # 关闭文件 fo.close() 以上实例输出结果为: 文件名为: test.txt 查看文件内容: $ cat test.txt 菜鸟教程 1 菜鸟教程 2

三、read()方法 从文件读取指定的字节数,如果未给定或为负则读取所有。

read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。

语法:

fileObject.read([size])

参数

size – 从文件中读取的字节数。

返回值

返回从字符串中读取的字节。

实例 以下实例演示了 read() 方法的使用: 文件 runoob.txt 的内容如下:

1:www.runoob.com 2:www.runoob.com 3:www.runoob.com 4:www.runoob.com 5:www.runoob.com

循环读取文件的内容:

#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开文件 fo = open("runoob.txt", "rw+") print("文件名为: ", fo.name) line = fo.read(10) print ("读取的字符串: %s" % (line)) # 关闭文件 fo.close() 以上实例输出结果为: 文件名为: runoob.txt 读取的字符串: 1:www.runo

四、 readline()方法: 读取整行,包括 "\n" 字符。

readline() 方法用于从文件读取整行,包括 “\n” 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 “\n” 字符。

语法

fileObject.readline([size])

参数

size – 从文件中读取的字节数。

返回值

返回从字符串中读取的字节。

实例 以下实例演示了 readline() 方法的使用:

文件 runoob.txt 的内容如下:

1:www.runoob.com 2:www.runoob.com 3:www.runoob.com 4:www.runoob.com 5:www.runoob.com

循环读取文件的内容:

#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开文件 fo = open("runoob.txt", "rw+") print ("文件名为: ", fo.name) line = fo.readline() print ("读取第一行 %s" % (line)) line = fo.readline(5) print ("读取的字符串为: %s" % (line)) # 关闭文件 fo.close()

以上实例输出结果为:

文件名为: runoob.txt 读取第一行 1:www.runoob.com 读取的字符串为: 2:www

五、readlines()函数

读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。如果碰到结束符 EOF 则返回空字符串。

语法

fileObject.readlines([sizeint])

参数

无 返回值 返回列表,包含所有的行。

实例 以下实例演示了 readline() 方法的使用:

文件 runoob.txt 的内容如下:

1:www.runoob.com 2:www.runoob.com 3:www.runoob.com 4:www.runoob.com 5:www.runoob.com

循环读取文件的内容:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开文件 with open("runoob.txt", "r") as fo: print ("文件名为: ", fo.name) for line in fo.readlines(): #依次读取每行 line = line.strip() #去掉每行头尾空白 print ("读取的数据为: %s" % (line))

以上实例输出结果为:

文件名为: runoob.txt 读取的数据为: 1:www.runoob.com 读取的数据为: 2:www.runoob.com 读取的数据为: 3:www.runoob.com 读取的数据为: 4:www.runoob.com 读取的数据为: 5:www.runoob.com

六、flush()函数

flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。

一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。

语法

fileObject.flush()

参数

返回值

该方法没有返回值。

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- # 打开文件 fo = open("runoob.txt", "wb") print ("文件名为: ", fo.name) # 刷新缓冲区 fo.flush() # 关闭文件 fo.close() 以上实例输出结果为: 文件名为: runoob.txt

进度条实例:

#!/usr/bin/python # -*- coding: UTF-8 -*- import sys,time for i in range(30): #进度条类型 sys.stdout.write("*") sys.stdout.flush() time.sleep(0.2)

七、常见错误 第一种场景: 在 write 内容后,直接 read 文件输出会为空,是因为指针已经在内容末尾。

两种解决方式: 其一,先 close 文件,open 后再读取, 其二,可以设置指针回到文件最初后再 read

# -*- coding: UTF-8 -*- import os; document = open("testfile.txt", "w+"); print( "文件名: ", document.name); document.write("这是我创建的第一个测试文件!\nwelcome!"); print(document.tell()); #输出当前指针位置 document.seek(os.SEEK_SET); #设置指针回到文件最初 context = document.read(); #读文件 print(context); document.close();

第二种场景: Python 在 Windows 环境下(在 linux 环境下不存在此问题),在 write 后,直接 read, 会出现乱码问题。如下:

fo = open("foo.txt", "w+") fo.write('www.runoob.com') print fo.read() 运行结果会出现一堆乱码,我们会初步判断为编码问题, 但其实并不是编码问题, 而是 EOF 的问题,也就是指针的位置问题,当我们以 w+ 开启文件读写模式的时候,由于是 w,所以文件会被清空,也就是文件为空,初始状态指针为 0 ,也就是初始即为 EOF 位置。当我们写入字符串 www.runboon.com 后,指针的位置为 15,文件在缓存中的的内容为 www.runboon.com[EOF],指针的最后位置为 15, 所以直接 read的时候会默认跳过 15,直到读取到了前一个 EOF 为止,所以你会得到缓存中的一堆乱码。

解决方案:

要想在write()后执行read()方法: 需要先执行flush()方法或指定一个文件读取为止(即close())。

改进以后的代码如下:

fo = open("foo.txt", "w+") fo.write('www.runoob.com') fo.flush() fo.seek(0) #指定指针为止为文件开头 print (fo.read())

读取乱码问题完美解决。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3