一、文件永久存储
如何将数据永久的存放在硬盘上,具体如下。
1.打开文件
定义:往大了讲计算机系统中由操作系统管理的具有名称的存储区域,往小了讲是生活中的PPT、Excel、word三剑客、视频文件、音频文件等。
创建打开文件: open()函数
字符串 含义
‘r’ 读取(默认)
‘w’ 写入(如果文件已存在则先截断清空文件)
‘x’ 排他性创建文件(如果文件已存在则打开失败)
‘a’ 追加(如果文件已存在则在末尾追加内容),注1
‘b’ 二进制模式,注2
‘t’ 文本模式(默认),注3
‘+’ 更新文件(读取和写入)
文件对象的各种方法及含义:
方法 含义
- f.close() 关闭文件对象
- f.flush() 将文件对象中的缓存数据写入到文件中(不一定有效)
- f.read(size=-1, /) 从文件对象中读取指定数量的字符(或者遇到 EOF 停止);当未指定该参数,或该参数为负值的时候,读取剩余的所有字符
- f.readable() 判断该文件对象是否支持读取(如果返回的值为 False,则调用 read() 方法会导致 OSError 异常)
- f.readline(size=-1, /) 从文件对象中读取一行字符串(包括换行符),如果指定了 size 参数,则表示读取 size 个字符
- f.readlines(size=-1, /) 从文件对象中读取所有字符串(包括换行符),然后按行为单位存储到列表中
如果指定了 size 参数,则表示读取 size 个字符(如果 size 参数指定的字符个数少于第一行字符个数,则仍然存放第一行字符,其他行也一样,它是按 “行” 为单位存储的) - f.seek(offset, whence=0, /) 修改文件指针的位置,从 whence 参数指定的位置(0 代表文件起始位置,1 代表当前位置,2 代表文件末尾)偏移 offset 个字节,返回值是新的索引位置
- f.seekable() 判断该文件对象是否支持修改文件指针的位置(如果返回的值为 False,则调用 seek(),tell(),truncate()方法都会导致 OSError 异常)
- f.tell() 返回当前文件指针在文件对象中的位置
- f.truncate(pos=None, /) 将文件对象截取到 pos 的位置,默认是截取到文件指针当前指定的位置
- f.write(text, /) 将字符串写入到文件对象中,并返回写入的字符数量(字符串的长度)
- f.writable() 判断该文件对象是否支持写入(如果返回的值为 False,则调用 write() 方法会导致 OSError 异常)
- f.writelines(lines, /) 将一系列字符串写入到文件对象中(不会自动添加换行符,所以通常是人为地加在每个字符串的末尾)
例1:
>>> f=open("FishC.txt","w") #存在FishC文件则打开,不存在则创建文件。
>>> f.write("I love Python")
13
>>> f.writelines(["I love FishC.\n","I love my wife."]) # 文件写内容
>>> f.close() # 文件对象关闭了,数据才能写入到文件中。执行完f.close()后,打开文件,内容才能写入。
>>>
例2:
>>> f=open("FishC.txt","r+") # r+可以读取和写入。
>>> f.readable() # 可以读取
True
>>> f.writable() # 可以写入
True
>>>
>>> for each in f: # 将文件放到for语句进行读取
print(each)
I love PythonI love FishC.
I love my wife.
# f.read()文件读取,但没有内容。原因是文件内部有个文件指针,它负责指向文件的当前位置,当在文件中读取一个字符的时候,它这个文件指针就会指向下一个字符,直到文件结尾。
>>> f.read()
''
>>> f.tell() # 文件末尾的位置
43
>>> f.seek(0) # 修改文件指针,输入0时,指向开头。
>>> f.readline() #读取一行
'I love PythonI love FishC.\n'
>>>
>>> f.read() # 读取到文件的末尾
'I love my wife.'
例3:
>>> f.write("I love my WIFI")
14
>>> f.flush() # 不关闭文件,将内容写到文件中。
>>>
>>> f.truncate(29) # 截断操作,读取到29的位置
29
>>> f.close()
>>>
>>> f=open("FishC.txt","w") #打开文件什么都不做,再关闭,文件是空的。
>>> f.close()
课后题:
1. “在打开一个文件对象之后,大多数的文件操作都是在缓冲区里面进行的。因此,如果希望将文件内容保存,我们需要使用 close() 方法关闭文件对象,这样数据才能从缓冲区写入到文件中。”,那么请问大家,有没有办法在不关闭文件对象的情况下,进行内容的保存呢?
答:使用 flush() 方法。
2. 请问如果指定 readline(size=-1) 方法的 size 参数为 3,那么表示的含义是什么?
答:读取 3 个字符。
解析:虽然是 readline() 方法,但如果执行 size 参数的话,那么指定的还是读取的字符个数(而非行数)。
3. 请问下面代码会在文件中写入几行字符串呢?
>>> f = open("FishC.txt", "w")
>>> f.writelines(["FishA", "FishB", "FishC"])
>>> f.close()
答:一行。
解析:writelines() 方法虽然名字叫 “写入多行数据”,但其实它并不会自动添加换行符,所以通常我们是需要人为地将换行符加在每个字符串的末尾。
4. 请问在课堂中的代码,为什么我们写入的时候只有一个换行符,但是使用 for 语句读取并打印出来却多了一个空白行呢?
>>> f = open("FishC.txt", "w")
>>> f.writelines(["I love FishC.\n", "I love my wife."])
>>> f.close()
>>> f = open("FishC.txt", "r")
>>> for each in f:
... print(each)
...
I love FishC.
I love my wife.
答:当 for 语句作用于文件对象时,是按行进行迭代的,也就是将文件中的每一行内容读取到 each 变量中,这样理论上打印出来应该是两行,而非三行。
因为 print() 函数默认是会在末尾添加一个换行符,如果将代码改成下面这样就不会了:
>>> for each in f:
... print(each, end='')
...
I love FishC.
I love my wife.
5. 请问下面代码为什么会报错?
>>> f = open("C:\Users\goodb\Desktop\FishC.txt", "w")
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
答:因为路径中存在转义字符,导致文件路径解析错误。
应该这么改:
>>> f = open(r"C:\Users\goodb\Desktop\FishC.txt", "w")
6. 使用 “w” 模式打开文件之前一定要注意什么?
答:一定要注意指定文件是否已存在。
解析:如果该文件已存在并且包含了内容,那么使用 “w” 模式打开将直接抹去原有的内容,导致原有数据丢失(是很可怕的事情)。
7. 如果一个文件不存在,是否可以使用 “a” 模式将其打开?
答:可以。
解析:
相对于 “w” 模式来说,“a” 模式会比较 “温和”,指定文件如果存在的话,后者不会导致数据丢失,而是使用追加的方式将数据写入文件。
不过注意,不存在说哪一个模式更优秀的说法,因为将一切情况都考虑在内,是每一个优秀程序员的职责所在。
8. 文件指针的作用是什么?
答:指示文件对象当前读取或者写入的位置。
9. 什么是 EOF?
答:End Of the File,表示文件末尾的位置。
解析:如果在读取模式中,当文件指针指向 EOF 的时候,说明文件已经全部读取完毕。
10. 如何知道文件指针当前指定的位置?
答:可以使用 tell() 方法来追踪文件指针的位置。
f.tell() 返回当前文件指针在文件对象中的位置
课后题来自小甲鱼python永久存储(上)