文章目录
1. 文件的打开方式
1.1 open
python在对文件进行编辑的时,首先需要打开文件获取文件对象,然后调用一系列函数对文件对象进行操作。
file = open(file_name, mode, buffering, encoding, newline)
参数简介:
- file_name: 被打开文件的路径/文件名。
- mode :文件打开方式,详情见下表。
- buffering : 设置缓冲区大小,
负数 :使用默认的缓冲区大小
0 : 关闭缓冲区(仅二进制模式打开允许);
1 : 行缓冲,即遇到换行符则将缓冲区内容写入磁盘(仅文本模式允许);
n (n > 1) :自己设定的缓冲区大小(单位:字节) - encoding :指定编码格式
- newline :默认为None,可以设定为
''
,\n
,\r
,\r\n
文件的打开方式
字符 | 含义 | 文件不存在时 |
---|---|---|
r | 只读模式(默认),指针放开头 | 报错 |
w | 只写(覆盖写) | 创建新文件 |
a | 追加写(仅有写权限),指针放末尾 | 创建新文件 |
?b | 以2进制模式打开,其他同上 | 同上 |
?+ | 同时获取读和写的权限,其他同上 | 同上 |
下面对buffering和newline做出详细解释:
buffering参数
此参数的作用是设置程序读写文件时缓冲区的大小。通常程序在向文件中写入数据的时候,会先写入内存(缓冲区)中,等到缓冲区满了才会一次性将内存的内容写到磁盘里。
引申:
但是当我们写出如下函数时
file = open('f:\\1.txt','w')
file.write('hello world')
这里没有调用file.close()
对文件进行保存关闭,那么文件1.txt中不应该有内容。而事实上文件中是有内容的,查了资料说是因为当程序结束后,会自动调用file.flush()
函数刷新缓存,同时将缓存中的内容写入到对应的文件中。
为了证实上述说法,我加入了sleep()
函数来延迟程序的结束
import time
file = open('f:\\1.txt','w')
file.write('hello world')
time.sleep(60)
在60s内函数为结束前,打开文件查看发现hello world
并未被写入到文件中,当程序结束时,字符串则会自动写入。
综上所述:
程序在写入数据时,由于磁盘读写速度的问题,往往都会先写到内存中,但是当程序结束时,会默认调用flush()
函数刷新内存,强制将内存的数据写入的磁盘中。
因此,为了避免某些以外的发生在使用file.open()
打开文件以后,一定要使用file.close()
将文件进行关闭(类似于我们手动的save-> close)
newline参数
写入内容时:
None(默认参数) : 将文本中的\r
都转换为\n
输入到文件中
‘’
:不做任何改变,将文本原样输入到文件中
\r
:将文本中的\n
都转换为\r
输入到文件中
\r\n
:将文本中的\n
都转换为\r\n
输入到文件中
从文件中读取数据时
None : 换行符都变成\n
''
: 原样输出
注意:windows默认的换行为\r\n
而linux为\n
,可以设置newline=''
的方式打开文件并读取内容(利用repr()函数将特殊字符显示出来),可以清晰地看到两个平台换行的差异
1.2 with as
上面在使用open()
函数打开文件时,强调过要注意使用close()
函数对操作过的文件进行关闭;但是如果当你在操作文件的过程中出现了差错,由于程序还没有运行到close()
语句,那么往往就会导致文件不能及时关闭。而with as
语句可以很好地解决这个问题。
with 表达式 as target:
code
作用是将表达式的返回值赋值给target,如下:
with open('f:\\1.txt') as f:
...
就是将open函数返回的文件对象赋值给了变量f,相当于f = open('f:\\1.txt')
。
使用with as
作为上下文管理器可以对文件对象的获取和释放做出及时的处理。
1.3 文件对象的属性
file.name
: 返回文件名file.mode
:返回文件的打开模式file.encoding
:返回打开文件时的编码格式file.closed
:判断文件是否关闭
2. 基础操作函数
2.0 文件指针
2.0.1 什么是文件指针?
文件指针你可以联想到我们在记事本中打字时,屏幕上的光标。python在向文件读取和写入文本内容的时候,往往是在文件指针出进行读取和写入的。也就相当于我们在打字的时候,每次输入的文字都是从光标处开始。
2.0.2 相关函数
-
file.tell()
返回文件指针的位置(0为开头)
-
file.seek()
seek(offset, whence), 对文件指针进行重定位。
参数:
- offset: 指针偏移量,正数向后偏移,负数向前偏移。由whence参数先对指针进行定位,然后由offset参数对指针进行前/后偏移。
- whence: 指定指针的位置。0为开头(默认值),1为当前位置,2为末尾。(当whence参数非0时,需要以二进制形式打开文件)
2.1 read系列
-
file.read([size])
非二进制模式打开:逐个字符读取文本内容,
二进制模式打开文件:逐个字节读取文本内容
通过参数size指定读取长度,默认读取全部内容。 -
file.readline([size])
按行读取,读取文本的一行内容.
参数size:在读取一行中,size指定读取改行的长度 -
file.readlines()
按行读取,读取所有行,返回一个列表,每行为一个列表元素
2.2 write系列
-
file.write(string)
将字符串string写入文件file中
write为覆盖写,若文字指针处于文本之前,写入的内容会覆盖原本的内容。
file.write(string)会返回string的长度
-
file.writelines(string)
将参数string的内容写入文件中
file.writelines()的返回值是None
2.2.1 write
和writelines
的区别:
writelines
的参数可以是字符序列(不能是数字序列)
y = ['hello',' ','world','!']
x = open('f:\\1.txt','w')
m = x.writelines(y)
x.close()
hello world!
write
的参数必须是字符串:
y = ['hello',' ','world','!']
x = open('f:\\1.txt','w')
m = x.write(y)
x.close()
Traceback (most recent call last):
File "e:\code\python\py_study\test.py", line 3, in <module>
m = x.write(y)
TypeError: write() argument must be str, not list
2.3 删除文件内容
file.truncate([size])
从指针位置开始,清除size大小的数据,如果没有给定size则清除指针后所有的内容。
此函数在调用时必须具备写
权限。