"一封信,写下太多如果"
如果有一定语言基础的,一定对文件操作十分得"熟悉"!当然,这种熟悉是 引起人恼怒的 也不为过。 python 也有自己的文件操作,那它跟C\C++又有何不同呢?
一、文件的基本操作
(1)打开或关闭
内建函数open, 能够打开一个指定路径下的文件, 返回一个文件对象.
open最常用的有两个参数, 第一个参数是文件名(绝对路径或者相对路径), 第二个是打开方式, 'r'/'w'/'a'/'b',表示读(默认) /写/追加写/二进制.
注:关于内建函数
我们反复遇到了 "内建函数" 这个词. 内建函数其实是包含在 __builtins__ 这个模块中的一些函数.
而 __builtins__ 这个模块Python解释器会自动包含
注:关于文件对象
我们学习C语言知道 FILE* , 通过 FILE* 进行文件读写操作 ,我们学习Linux时又知道, FILE* 结构中其实包含了文件描述符, 操作系统是通过文件描述符来对文件操作的。
Python的文件对象, 其实也包含了文件描述符, 同时也包含了这个文件的一些其他属性. 本质上也是通过文件描述符完成对文件的读写操作。
#文件操作
f = open('./test.txt', 'w') #打开文件
f.close() #关闭文件
(2)读文件
读文件的前提是,该文件被打开之前已经存在。
read: 读指定长度字节数的数据, 返回一个字符串。
readline: 读取一行数据, 返回一个字符串。
readlines: 读取整个文件, 返回一个列表. 列表中的每一项是一个字符串, 代表了一行的内容。
该文件已经存在;
我们分别用上面的三个read进行读取;
除开用readlines读取,也可以直接进行循环读取(但这样效率上比 readines 更慢);
(3)写文件
write: 向文件中写一段字符串.
如需写文件, 必须要按照 'w' 或者 'a' 的方式打开文件. 否则会写失败writelines: 参数是一个列表, 列表中的每一个元素是一个字符串
并没有一个 writeline 这样的函数. 因为这个动作等价于 write 时在字符串后面加上 '\n'. 同理, 使用writelines的时候, 也需要保证每一个元素的末尾, 都带有 '\n‘’。
write:
writelines;
(4)关于读写缓冲区
我们知道, C语言库函数中的fread, fwrite和系统调用read, write相比, 功能是类似的. 但是
fread/fwrite是带有缓冲区的(这是语言级别的缓冲区)。Python的文件读写操作, 既可以支持带缓冲区, 也可以选择不带缓冲区。
(5)文件对象
文件具备随机访问能力. 这个过程是通过操作文件指针完成的
seek: 将文件指针移动到从文件开头算起的第几个字节上. 有两个参数. 第一个参数offset表示偏移的字节数. 第二个参数whence表示偏移量的起始位置在哪. 值为0, 表示从开头计算, 值为1:表示从当前位置.值为2: 表示从文件结尾位置.
tell: 获取当前文件指针指向的位置. 返回当前位置到文件开头的偏移量
(6)上下文管理器
如果打开了文件 不选择关闭 会发生什么?
我想从聪明的你一定知道。 系统的文件资源描述符越来越少。 直到最后 抛异常 告诉你没有更多的文件描述符了。
可能你会说,“我很严谨! 打开文件后 我一定 会吗写一个close”! 然而事实上,很多情况不单单是我们 忘记close。 而是遇到整个代码里 如果有异常的地方,那么 代码可能就不会跑到close处。
从而导致 文件资源泄漏。 C++中为解决这个问题, 特地引入了智能指针来 用来管理这些资源。
那么python是如何解决的呢?
ith open('out') as f:
print(''.join(f.readlines()))
在with语句块内进行文件操作. 当文件操作完毕之后, 出了with语句之外. 就会自动执行f的关闭操作.一个支持上下文协议的对象才能被应用于with语句中. 我们将这种对象称为上下文管理器.
Python中很多内置对象都是上下文管理器, 例如文件对象, 线程锁对象等
二、文件系统的基础操作
(1)文件路径的操作
os.path这个模块中, 包含了一些实用的路径操作的函数
(2)常见的文件系统操作
os模块中包含了很多对文件/目录的基础操作, 参见下表
总结:
①open('文件名','w/r/a',encoding = 'xxx') close()
②read\readline\readlines\ write\writelines
③os.path 查找系统路径模块的一些 函数还是比较重要。 exist
本篇到此结束了
感谢您的阅读
祝你好运~