Python文件操作
文件的定义在没有操作系统的年代是没有文件这一定义的。文件实际上也是一个虚拟的东西,是建立在操作系统之上的一个概念。 通过文件能够让使用计算机的人更加方便的操纵硬盘上的数据,因为应用程序在运行时所有的数据全部存放于内存中,因内存具有断电数据丢失的特性故若想永久保留其中的一些数据则必须将该数据存放于硬盘上面。而人类对文件的操作实际上是在调用操作系统提供的一个接口对底层硬件发起系统调用(再次强调:只有操作系统才能直接调用硬件。应用程序或者说是用户都只能通过操作系统间接调用底层硬件)。因此可以理解为:文件是操作系统提供给人类操控硬盘的一个接口而已。 绝对路径与相对路径这个比较简单,绝对路径是从根部查找,相对路径是从当前地查找。看下图即可明了: open()方法 Python提供
一定要注意。在使用 Python2中open()方法 由于Python2中不能使用 #!/usr/bin/env python2 #coding:utf-8 import sys reload(sys) sys.setdefaultencoding('utf-8') 设置默认的解码方式为 utf-8。如果这样操作就不用设置decode()了。 f = open(file="test.txt",mode=rt",) data = unicode(f.read().decode(utf-8")) unicode()将读取出的字符转为unicode字符存储于内存中。decode()设定解码方式。read()是读取全部文件内容 print data f.close() 关闭文件。这一点非常重要!具体原因下面会讲到。 ==== 执行结果 ==== Ps:可以看到换行符也算在里面的。这一点要注意 """ hello,world ? hello,Python ? 你好世界, ? 你好蟒蛇, ? ? """ Python3中open()方法 在Python3中如果不指定 !/usr/bin/env python3 coding:utf-8 ) data = f.read() 由于Python3可以指定encoding参数并且字符串类型本身就是Unicode字符,所以直接用就好。 (data) f.close() """ with上下文管理器 上面讲到。 with open(file=") as f: as f 实际上与 f = open() 相当。它被称为文件句柄 data = f.read() (data) 当操作完成后自动使用close()方法关闭打开的文件。至于为什么要关闭打开的文件具体原因下面会讲到。 ) as f1, open(file=test2.txt) as f2: data1 = f1.read() (data1) print (====手动分割====) data2 = f2.read() (data2) 当操作完成后自动使用close()方法关闭打开的文件。至于为什么要关闭打开的文件具体原因下面会讲到。 """ 这里是test2的内容 """ 控制文件读写内容的模式t模式 好了,上面讲到了 b模式 rb) as f: data = f.read().decode(") 计算机本身就是二进制存储,要打开文本文件必然可行。前提是解码方式正确 当操作完成后自动使用close()方法关闭打开的文件。至于为什么要关闭打开的文件原因下面会讲到。 """ 控制文件读写操作的模式r模式 还是 w模式 test3.txtwt") as f: 该文件并不存在,当执行该脚本时将创建该文件。 data = 你好世界n我是说...nhello,world!!!n f.write(data) 写入unicode字符串至文件中。 f.read() # 不能使用 read() 读相关的方法 a模式
? 以下代码执行了3次。第一次创建新文件写入一次内容,后两次文件指针在最后进行追写。所以你会看到... with open(file=test4.txtathello world!!!n我是说...n你好世界n 写入unicode字符串至文件中。写完后文件指针跑到末尾 # f.read() # 不能使用 read() 读相关的方法? x模式 +方法 w+t 也可以写成 *t+ 。当然*+t更标准 data = f.write(data) f.seek(0,0) 由于写入过后文件指针跑到末尾,所以需要将文件指针放到开始才能读取出内容 print(f.read()) 本来w模式不能读,但是使用了 + 方法后就就赋予w模式可读的权限。其他方法同理 ==== 执行结果 ==== hello world!!! 我是说... 你好世界 """
需要注意,如果使用 r+t) as f: data = 覆盖覆盖.. 由于写入过后文件指针会移动,所以需要将文件指针放到开始才能读取出内容 本来r模式不能写,但是使用了 + 方法后就就赋予r模式可写的权限。其他方法同理 覆盖覆盖.. 我是说... 你好世界 """ 如果使用 a+t) as f: f.seek(0,1)"> 移动文件指针到开头,如不移动将读取不出内容 (f.read()) """ 文件指针seek()方法与3种模式 文件指针的移动一通常情况下不会用到。但是请注意:尽量在
注意,文件指针除了(0,0)和(0,2)外,其他都应该用b模式进行。 print(f.tell()) 打印当前文件指针的位置 0 f.seek(220 打印当前文件指针的位置 20 f.seek(-2,1) f.seek(-3,1)">) f.seek(-4,1)">) 由于是相对定位,故可以累加。 20 - 9 ,文件指针在 11 0 20 11 """ 文件指针移动单位 为什么说使用 只有在 我们来看个实例: test5.txt r模式的指针默认放在0位置 f.seek(3,0) 只有在0模式下,t模式读取文件内容才不会抛出异常。根据0模式向后移动3个字节 ==== 执行结果 ==== Ps:如果seek()的第一个参数设置为4呢?岂不是抛出异常了? 爱中国 """ r模式的指针默认放在0位置 f.seek(4,1)"> 修改为4,代表根据文件开头向后移动4个字节后执行decode()解码操作。 raceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/learn/FileOperationsPy3.x.py",line 6,in <module> print (f.read()) File "C:Python38libcodecs.py",line 322,in decode (result,consumed) = self._buffer_decode(data,self.errors,final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0x88 in position 0: invalid start byte """ 读取文件的两种方法for循环读取 注意:如果直接使用 BigFileTest.txt r模式的指针默认放在0位置 for line in f: 每次读一行。以换行符为结束 print(line) 也就是说每次的在内存中的数据仅仅只有一行。 while循环读取 如果文件的所有数据都是在一行(Ps:有这种情况),那么使用 res = "" 接收到的整体结果 with open(file=while 1: temp = f.read(512) 代表每次读取512个字符。 res += temp if not len(temp): 代表没有新的内容。 len(data) == 0 break print(读取完毕..print(res) 写入文件的两种方法文本编辑器内部实现原理读取文件的两种形式我们已经介绍了,那么接下来介绍写入文件的两种形式。首先是文本编辑器的内部实现原理,在打开一个文本文件时其中所有的内容都会存放于内存中。对该文本内容的修改实际上全部都是在修改内存中的数据,当修改完成后点击保存时才会将内存的数据重新写入至硬盘中。你应该深有体会,打开一个特别大的文本文件时速度很慢,哪怕没做任何修改保存时速度也还是很慢。那么就是这个原因导致的。 coding:utf-8 data = 用于存放数据 with open(file=: temp = f.read(512) data += temp 代表每次读取512个字符。 print(data) 这里可以做其他操作 代表没有新的内容。 len(temp) == 0 ) data = data.replace(计算机电脑 模拟手动修改文件内容。将计算机修改为电脑,注意此时修改的是内存中的数据 读取后将Python应用程序中维护的data变量中的数据全部写入该文件。w模式会清空源文件的内容 f.write(data) 写入完毕..") 减少内存压力的同时写入文件文本编辑器的做法是在内部维护了一个变量,用于提供给用户修改内容。这么做的好处就是用户可以修改文件内容与查看到所有的全部文件内容但是坏处是占用内存空间太大。这里再介绍一种减少内存压力的方式。 注意:两种方式没有优劣之分,只有使用场景不同的区别。 import os with open(file=.BigFileTest.txt.swap") as f2: 以. 开头的文件代表隐藏文件。以swap结尾的文件代表交换文件(可以理解为临时文件) in f1: line = line.replace( 每次拿到和修改的只有line f2.write(line) 写入交换文件中 操作完成..) os.remove( 删除源文件 os.rename( 修改临时文件的名字。与源文件保持一致 这么做的坏处是没办法随时的修改内存中的变量数据,因为内存中根本没存文本文件内容... 只能按照 设定好的程序走一遍..但是极大的节省了内存空间的占用。 """ 文件操作方法大全
扩展:为什么要关闭文件 换行符在不同的平台下会有不同的差异。如Windows平台下其实实际使用的是 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |