2:read() readline() 和 readlines() 函数
log.txt文件内容:
arduino
复制代码
时间里的 https://guanchao.site
(1):read() 函数:逐个字节或者字符读取文件中的内容;
正常使用:
ini
复制代码
#以 utf-8 的编码格式打开指定文件 f = open("log.txt", encoding = "utf-8") #输出读取到的数据 print(f.read()) #关闭文件 f.close()
输出:
arduino
arduino
复制代码
时间里的 https://guanchao.site
使用 size 参数,指定 read() 每次可读取的最大字符(或者字节)数,例如:
ini
复制代码
#以 utf-8 的编码格式打开指定文件 f = open("log.txt",encoding = "utf-8") #输出读取到的数据 print(f.read(4)) #关闭文件 f.close()
输出:
复制代码
时间里的
读取二进制打开的文件内容:
lua
复制代码
#以二进制形式打开指定文件,该文件编码格式为 utf-8 f = open("log.txt",'rb+') byt = f.read() print(byt) print("\n转换后:") print(byt.decode('utf-8')) #关闭文件 f.close()
输出:
less
复制代码
b'\xe6\x97\xb6\xe9\x97\xb4\xe9\x87\x8c\xe7\x9a\x84\r\nhttps://guanchao.site'
转换后:
arduino
复制代码
时间里的 https://guanchao.site
(2):readline() 函数:逐行读取文件中的内容;
readline() 函数用于读取文件中的一行,包含最后的换行符“\n”
ini
复制代码
f = open("log.txt",encoding = "utf-8") # 读取一行数据 byt = f.readline() print(byt)
输出:
复制代码
时间里的
在逐行读取时,还可以限制最多可以读取的字符(字节)数,例如:
ini
复制代码
#以二进制形式打开指定文件 f = open("log.txt",'rb') # 指定读取字节数 byt = f.readline(4) print(byt)
输出:
bash
复制代码
b'\xe6\x97\xb6\xe9'
(3):readlines() 函数:一次性读取文件中多行内容。
readlines() 函数用于读取文件中的所有行,它和调用不指定 size 参数的 read() 函数类似,只不过该函数返回是一个字符串列表,其中每个元素为文件中的一行内容。
ini
复制代码
f = open("log.txt",'rb') byt = f.readlines() print(byt)
输出:
css
复制代码
[b'\xe6\x97\xb6\xe9\x97\xb4\xe9\x87\x8c\xe7\x9a\x84\r\n', b'https://guanchao.site']
3:write()和writelines():向文件中写入数据
在使用 write() 向文件中写入数据,需保证使用 open() 函数是以 r+、w、w+、a 或 a+ 的模式打开文件,否则执行 write() 函数会抛出 io.UnsupportedOperation 错误。
(1):wtite()
lua
复制代码
f = open("log.txt", 'a', encoding="utf-8") f.write("\n写入一行新数据") f.close() f = open("log.txt", encoding="utf-8") aa = f.read() print(aa) f.close()
输出:
arduino
复制代码
时间里的 https://guanchao.site 写入一行新数据
写入文件完成后,一定要调用 close() 函数将打开的文件关闭,否则写入的内容不会保存到文件中。例如,将上面程序中最后一行 f.close() 删掉,再次运行此程序并打开 log.txt,你会发现该文件是空的。这是因为,当我们在写入文件内容时,操作系统不会立刻把数据写入磁盘,而是先缓存起来,只有调用 close() 函数时,操作系统才会保证把没有写入的数据全部写入磁盘文件中。这个很重要 要注意
但是,在完成文件操作后,我不想使用close关闭文件就像读取到他的内容该怎么操作呢?
Python为我们提供了flush函数,它可以实现将缓冲区的数据写入文件中。
lua
复制代码
f = open("log.txt", 'a', encoding="utf-8") f.write("\n写入一行新数据flush") f.flush()
打开文件,我们可以看到:
arduino
复制代码
时间里的 https://guanchao.site 写入一行新数据 写入一行新数据flush
有的同学可能会想到,通过设置 open() 函数的 buffering 参数可以关闭缓冲区,这样数据不就可以直接写入文件中了?对于以二进制格式打开的文件,可以不使用缓冲区,写入的数据会直接进入磁盘文件;但对于以文本格式打开的文件,必须使用缓冲区,否则 Python 解释器会 ValueError 错误。例如:
lua
复制代码
f = open("log.txt", 'w',buffering = 0) f.write("写入一行新数据---关闭缓冲区之后")
输出:
arduino
复制代码
Traceback (most recent call last): File "F:/camellia/python/testProject/main.py", line 63, in <module> import ospath File "F:\camellia\python\testProject\ospath.py", line 70, in <module> f = open("log.txt", 'w',buffering = 0) ValueError: can't have unbuffered text I/O
(2):writelines()
writelines() 函数,可以实现将字符串列表写入文件中。
ini
复制代码
f = open('log.txt', 'r', encoding="utf-8") n = open('log1.txt','w+', encoding="utf-8") n.writelines(f.readlines()) n.close() f.close()
打开log1.txt:
arduino
复制代码
时间里的 https://guanchao.site 写入一行新数据 写入一行新数据flush
4:close() 关闭文件
Python的文件操作中,使用open创建/打开之后,必须使用close关闭。否则在某些操作的时候会报错:
lua
复制代码
import os # 打开 / 创建文件 f = open("log.txt",'w') # 删除文件 os.remove("log.txt")
输出报错:
arduino
复制代码
Traceback (most recent call last): File "F:/camellia/python/testProject/main.py", line 63, in <module> import ospath File "F:\camellia\python\testProject\ospath.py", line 83, in <module> os.remove("log.txt") PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'log.txt'