文件的读写操作
文件的读操作:open()
- 第一个参数必须有,表示文件的绝对路径或者相对路径
- 第二个参数mode,表示文件打开的方式
'r':读
'w':写
'a':追加
'r+' == r+w(可读可写,文件若不存在就报错(IOError))
'w+' == w+r(可读可写,文件若不存在就创建)
'a+' ==a+r(可追加可写,文件若不存在就创建)
对应的,如果是二进制文件,就都加一个b:
'rb' 'wb' 'ab' 'rb+' 'wb+' 'ab+'
f = open(r'.\.vscode\project\test.txt', 'r')#使用了相对路径 print(f.read()) f.close()
文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的,更重要的是,没有关闭文件则修改或者添加的内容还没有全部写入磁盘,其他文件读取的时候是无法获得的!
如果文件不存在,open()
函数就会抛出一个IOError
的错误,并且给出错误码和详细的信息告诉你文件不存在:
FileNotFoundError: [Errno 1] No such file or directory: 'test.txt'
由于文件读写时都有可能产生IOError
,一旦出错,后面的f.close()
就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally
来实现:
try: f = open('D:/Python/.vscode/project/test.txt', 'r')#使用了绝对路径 print(f.read()) finally: if f: f.close()
但是每次都这么写实在太繁琐,所以,Python引入了with
语句来自动帮我们调用close()
方法:with语句使用的技术是一种叫做上下文管理协议的技术,它可以自动判断文件的作用域,自动关闭不在使用的打开的文件句柄
#如果路径前没有r则要用\\转义字符或者使用/,r表示按原始字符处理 with open(r'D:\Python\.vscode\project\test.txt', 'r') as f: print(f.read())
python文件对象提供了三个“读”方法: read()、readline() 和 readlines(),每种方法可以接受一个变量以限制每次读取的数据量:
- read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,为了保险起见,可以反复调用
read(size)
方法,每次最多读取size个字节的内容。 - readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。
- readline() 每次只读取一行,通常比readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 readline()。
注意:这三种方法是把每行末尾的'\n'也读进来了,它并不会默认的把'\n'去掉,需要我们手动去掉,仔细比较下面几种写法的区别:
- readlines():
with open('D:/Python/.vscode/project/test.txt', 'r') as f: list = f.readlines() print(list) #['123\n', '456\n', '789\n']
with open('D:/Python/.vscode/project/test.txt', 'r') as f: list = f.readlines() for i in list: print(i) #123 # #456 # #789 #
去掉'\n'的方法:
with open('D:/Python/.vscode/project/test.txt', 'r') as f: list = f.readlines() for i in range(len(list)): list[i] = list[i].rstrip('\n') print(list) #['123', '456', '789']
- read():
with open('D:/Python/.vscode/project/test.txt', 'r') as f: list = f.read() print(list) #123 #456 #789 #
with open('D:/Python/.vscode/project/test.txt', 'r') as f: list = f.read() for i in list: print(i) #1 #2 #3 # # #4 #5 #6 # # #7 #8 #9 # #
- readline():
with open('D:/Python/.vscode/project/test.txt', 'r') as f: list = f.readline() print(list) #123 #
with open('D:/Python/.vscode/project/test.txt', 'r') as f: list = f.readline() for i in list: print(i) #1 #2 #3 # #
seek(offset, from):移动文件的读取位置,也叫读取指针
- from的取值范围:
- 0: 从文件头开始偏移
- 1:从文件当前位置开始偏移
- 2: 从文件末尾开始偏移
- 移动的单位是字节(byte)
- 一个汉子由若干个字节构成
- 返回文件只针对 当前位置
# 打开文件后,从第5个字节出开始读取 # 打开读写指针在0处, 即文件的开头 with open(r'test01.txt', 'r') as f: # seek移动单位是字节 f.seek(6, 0) strChar = f.read() print(strChar)
tell():用来显示文件读写指针的当前位置,单位是字节
with open('D:/Python/.vscode/project/test.txt', 'r') as f: s = f.read(2) ft = f.tell() while s: print(ft) print(s) s = f.read(2) ft = f.tell() #2 #my #4 # n #6 #am #8 #e #10 #is #12 # w #14 #jw
文件的写操作:write()
- write(str): 把字符串写入文件
- writelines(str): 把字符串按行写入文件
- 区别:
- write函数参数只能是字符串
- writerlines参数可以是字符串,也可以是字符序列
f = open('test.txt', 'w') # 若是'wb'就表示写二进制文件 f.write('Hello, world!') f.close()
注意:'w'这个模式是这样的:如果没有这个文件,就创建一个;如果有,那么就会先把原文件的内容清空再写入新的东西。所以若不想清空原来的内容而是直接在后面追加新的内容,就用'a'这个模式
我们可以反复调用write()
来写入文件,但是务必要调用f.close()
来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()
方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()
的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with
语句来得保险:
with open('test.txt', 'w') as f: f.write('Hello, world!')
# a代表追加方式打开,只能在文件末尾增加不能修改 with open('D:/Python/.vscode/project/test.txt', 'a') as f: f.writelines(' i love it \n') f.writelines(' and i hate it \n')
注意:换行符不会自动的加入,因此,需要显式的加入换行符!