Python file"文件"常用方法(三):读+写+刷新-write()、writelines()、read()、readline()、readlines()、flush()

一、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())

读取乱码问题完美解决。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值