文件读取模式
常用模式权限:
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | + | |||
追加 | + | + |
这部分我还是有一些疑问,比如:
w+和rw有什么区别?
答:没有rw这个模式,合法的模式有r、rb、r+、rb+、w、wb、w+、wb+、a、ab、a+、ab+
w+与r+区别
答 r+:可读可写,若文件不存在,报错;w+: 可读可写,若文件不存在,创建
一些没有该权限的例子:
写:比如r
模式打开的文件a = open("test.txt", "r")
,不能用write()方法a.write()
。
读:用w
模式打开的文件a = open("test.txt", "w")
,不能用read()方法a.read()
。
创建:r
和r+
模式如果打开的文件不存在会报错,而w
和w+
如果打开的文件不存在会自动创建。
实操
一,判断文件是否可读,并读取40位。
file = open('D:/desktop/1.txt', 'r', encoding='utf-8')
print(file.readable()) #判断文件是否可读
print(file.read(40)) #读取size位
file.close()
结果
True
1.对无线传感器网络结点的组成及各组成部分的功能进行说明。
数据采集单元、控制单
二,逐行读取文件
法一:使用readlines()
file = open('D:/desktop/1.txt', 'r', encoding='utf-8')
readline = file.readlines()
for i in readline:
print(i)
file.close()
结果:
1.对无线传感器网络结点的组成及各组成部分的功能进行说明。
数据采集单元、控制单元、无线通信单元以及能量供应单元。
...
法二:使用readline()
file = open('D:/desktop/1.txt', 'r', encoding='utf-8')
for i in range(50):
print(file.readline())
file.close()
结果:
1.对无线传感器网络结点的组成及各组成部分的功能进行说明。
数据采集单元、控制单元、无线通信单元以及能量供应单元。
...
三,写入字符串
w:写之前会清空文件内容,重新写入,若文件不存在,创建
x:创建新文件写入,若已经存在,报错
a:在文件的最后写入内容,若文件不存在,创建
1,删除文件原内容,并写入hello python
file = open('D:/desktop/2.txt', 'w', encoding='utf-8')
file.write('hello python')
file.close()
2,在文件2.txt后追加内容,im abc
file = open('D:/desktop/2.txt', 'a', encoding='utf-8')
file.write(',im abc')
file.close()
四,使用with来避免错误的发生
当对文件内容操作完以后,一定要关闭文件对象,f.close(),这样才能保证所做的任何修改都确实保存到了文件中。
文件操作一般都要遵循“文件打开>文件内容的读写->文件关闭”的基本流程,但是文件读写操作代码引发了异常,很难保证文件能够被正常关闭。此时可以使用上下文管理关键字with避免这个问题的1产生。关键字with能够自动管理资源,总能保证文件的正确关闭并且可以在代码执行结束后自动还原进入改代码块时的现场。简单来说,就是使用with来打开文件,可以不使用close()来关闭,with会自动关闭
例:
>>> with open('D:/desktop/2.txt', 'r') as f:
... f.read()
...
'123 456 789'
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
with结束之后再尝试打开发现文件对象已经被关闭
五,a+和w+模式的读取
这个问题源于我写的一段代码:用w+模式向文件写入内容并读取
>>> file = open('D:/desktop/2.txt', 'w+')
>>> file.write('123 456 789')
11
>>> file.read()
''
>>>
写入内容之后没有输出,网上搜了一下,发现问题是写入内容之后,指针就移动到写入内容之后,以便继续写入,如果要读取的话,需要先将指针移动到前面去。解决这个问题要用到seek()和tell()函数:
seek(off, whence)
作用:移动指针,off决定指针移动多少位,whence决定从哪里开始移动(0文件开头,1当前位置,2文件末尾)
例如:seek(0,0)就代表从文件开头移动0位,也就是将指针放在文件开头
tell()
作用:查看当前指针位置
我们可以用这两个函数完成a+ w+模式下的读取
>>> file = open('D:/desktop/2.txt', 'w+')
>>> file.write('123 456 789')
11
>>> file.tell()
11
现在指针的位置是在11,然后我们将指针移动到开头去再读取
>>> file.seek(0,0)
0
>>> file.read()
'123 456 789'
成功读取到文件内容