1.文件操作:读、写、追加
读:open(参数1:文件路径,参数2:打开模式,参数3:文件编码)
文件路径:
相对路径:在E盘下a.txt
绝对路径:e:\\test\\a.txt
fp.close()
fp=open("e:\\b.txt",encoding="gbk")
content=fp.read()
fp.close()
print(content)
2.读的时候处理文件状态:
import os
if os.path.exists("e:\\axxxxx.txt"):
fp=open("e:\\axxxxx.txt",encoding="utf-8")
content = fp.read()
fp.close()
print(content)
try:
fp=open("e:\\axxxxx.txt",encoding="utf-8")
content = fp.read()
fp.close()
print(content)
except IOError:
print("此文件的读操作遇到io错误")
3.操作系统有资源句柄:一个指针指向了一个文件,就可以操作文件了,例如读写。
句柄在操作系统资源是有限的,65535个。如果所有句柄都被打开,且不释放,句柄泄露。
4.读行和读全部
>>> fp=open("e:\\hello.txt","r",encoding="gbk")
>>> fp.readline(2)
'白日'
>>> fp.readline(2)
'依山'
>>> fp.readline(2)
'尽\n'
>>> fp.readline(2)
'黄河'
>>> fp.close()
5.遍历行
6.定位位置:fp.seek(offset[, whence])
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
返回值:如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。
gbk存中文,是两个字符;utf-8存中文,是三个字符。
utf-8文件,默认有bom。
>>> fp=open("e:\\a.txt","r",encoding="gbk")
>>> fp.readline()
'第一行\n'
>>>
>>> fp.readline()
'第二行\n'
>>> fp.seek(0,0)
0
>>> fp.readline()
'第一行\n'
>>> fp.seek(2,0) #第一个参数表示第二个字节,第二个参数表示从第几行
2
>>> fp.readline()
'一行\n'
>>> fp.close()
>>> fp=open("e:\\a.txt","r",encoding="utf-8")
>>> fp.readline()
'\ufeff第一行\n'
>>> fp.readline()
'第二行\n'
>>> fp.readline()
'第三行\n'
>>> fp.seek(2,0)
2
>>> fp.readline()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\Administrator.DESKTOP-LFNQE7C\AppData\Local\Programs\Python\Python37\li
b\codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start by
te
3
>>> fp.readline()
'第一行\n'
>>> fp.seek(6,0)
6
>>> fp.readline()
'一行\n'
练习:
>>> fp=open("e:\\a.txt") #fp=open("e:\\a.txt","r",encoding="gbk")
>>> #默认使用gbk编码读取文件,并且使用读模式
...
>>> content=fp.read()
>>>
>>> print(content)
第一行
第二行
第三行
第五行
>>> fp.close()
#以上全读方式,如果文件很大,则把内存占满
>>> fp.readlines()
['第一行\n', '第二行\n', '第三行\n', '\n', '第五行']
>>> fp.close()
>>> fp=open("e:\\a.txt","r",encoding="gbk")
>>> for line in fp:
... print(line)
...
第一行
第二行
第三行
第五行
>>> fp.close()
#以上,读大文件,应该按行读
>>> fp=open("e:\\a.txt","r",encoding="gbk")
>>> fp.readline()
'第一行\n'
>>> fp.readline()
'第二行\n'
>>> fp.readline().strip()
'第三行'
>>> fp.readline().strip()
''
>>> fp.readline().strip()
'第五行'
>>> fp.readline().strip()
''
>>> fp.close()
7.写:
"w":清空写
w:如果文件存在,则清空文件内容开始写;如果文件不存在,则新建文件后开始写内容。
写入时文件有缓存机制,可使用flush()方法,把缓存的命令执行。
"a":追加写
>>> fp=open("e:\\hello.txt","w",encoding="gbk")
>>> fp.write("白日依山尽\n")
6
>>> fp.write("黄河日还了\n")
6
>>> fp.flush()
>>> fp.close()
>>> fp=open("e:\\hello.txt","a",encoding="gbk")
>>> fp.write("欲穷千里目\n")
6
>>> fp.write("更上一层楼\n")
6
>>> fp.flush()
>>> fp.close()
8.写、读:
"w+"清空写,可以读
"r+"写,可以读
#1. r+新写入的内容会覆盖原文件中的内容,写入几个字符,则覆盖几个字符 #2. r+会从文件开头开始进行文件读写,所以每次写入时,都会从一开始(第一行)进行。如果先读后写,则会写在最后。 #3. \n换行符相当于两个字符 #4. r+写完后,文件指针会停留在新写入的字符后面,所以在read时,只read新写入字符后面的那些内容
>>> fp=open("e:\\hello.txt","w+",encoding="gbk")
>>> fp.write("白日依山尽\n")
6
>>> fp.write("黄河入海流\n")
6
>>> fp.seek(0,0)
0
>>> fp.read()
'白日依山尽\n黄河入海流\n'
>>> fp.close()
9.tell() 方法返回文件的当前位置,即文件指针当前位置。
>>> fp=open("e:\\hello.txt","r",encoding="gbk")
>>> fp.readline(2)
'he'
>>> fp.tell()
2
>>> fp.seek(0,0)
0
>>> fp.tell()
0
>>> fp.close()
10.二进制读:rb、wb
一般用于对图片的复制等操作。
>>> fp=open("e:\\1.jpg","rb")
>>> content=fp.read()
>>> fp1=open("e:\\new_1.jpg","wb")
>>> fp1.write(content)
28436
>>> fp.close()
>>> fp1.close()
11.os包
>>> import os
>>>
>>> os.name
'nt'
>>> os.linesep
'\r\n'
>>> os.pathsep
';'
>>> os.getcwd() #查看当前所在目录
'E:\\'
>>> os.chdir("d:\\test") #改变当前所在目录
>>> os.getcwd()
'd:\\test'
>>> os.listdir()
['1.jpg', 'a.txt', 'b.txt', 'c.txt', 'new_1.jpg']
>>> os.path.isfile("d:\\1.jpg")
False
>>> os.path.isfile("d:\\test\\1.jpg") #判断是不是文件
True
>>> os.path.isdir("d:\\test") #判断是不是目录
True
>>> os.path.isdir("d:\\test\\1.jpg")
False
>>> os.path.exists("d:\\test\\1.jpg") #判断路径是否存在
True
>>> os.path.exists("d:\\test\\2.jpg")
False
>>> os.path.split("d:\\test\\1.jpg") #返回路径名和文件名
('d:\\test', '1.jpg')
>>> os.path.dirname("d:\\test\\1.jpg") #返回路径名
'd:\\test'
>>> os.path.basename("d:\\test\\1.jpg") #返回文件名
'1.jpg'
>>> os.makedirs("d:\\test\\test1\\test2") #新建目录
>>> os.removedirs("d:\\test\\test1\\test2") #删除目录
>>> os.remove("d:\\new_1.jpg") #删除文件,文件不存在报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'd:\\new_1.jpg'
>>> os.remove("d:\\test\\new_1.jpg") #删除文件
>>> os.path.splitext("d:\\test\\1.jpg") #返回文件名和后缀名
('d:\\test\\1', '.jpg')