文件的读写操作

文件的读操作: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')

注意:换行符不会自动的加入,因此,需要显式的加入换行符!

 

posted @ 2019-03-15 12:34  皮皮嘉  阅读(854)  评论(0编辑  收藏  举报