文章内容
2017/9/22 10:50:32,作 者: 黄兵
Python 文件操作 永久存储(一)
1.文件:因为你懂,所以永恒
大多数的程序都遵循着:输入=》处理=》输出的模型,首先接收输入数据,然后按照要求进行处理,最后就是输出数据。在编写代码的时候,操作系统未来更快地做出响应,把当前的数据都放在内存中,那是因为内存和CPU数据传输的速度比在硬盘和CPU之间传输的速度快很多倍。但是内存有一个不足就是,一旦断电,内存中的数据就会丢失。所以在这里提醒大家在写代码的时候一定要习惯保存,这是用window的经验之谈。
1.1 打开文件
在Python中,使用open()函数打开文件并返回文件对象:
open(file, mode = 'r', buffering = -1, encoding = None, errors = None, newline = None, closed = True, opener = None)
open()函数有很多参数,这里只需要关注第一个和第二个参数就好。第一个参数是出入的文件名,第二个参数是打开方式。如果第一个参数只是一个文件名表示打开的是当前目录下的文件,如果是路径的话表示路径下的文件,不过要是打开的文件不存在呢?看一下例子:
[root@localhost home]# python
Python 3.5.3 (default, Jul 8 2017, 13:46:38)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('read.txt', 'r')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'read.txt'
看到报错信息了吧,提示文件不存在。
下面是第二个参数的打开模式,如下表
| 打开模式 | 执行操作 |
|---|---|
| 'r' | 以只读方式打开文件(默认) |
| 'w' | 以写入的方式打开文件,会覆盖已存在的文件 |
| 'x' | 如果文件已经存在,使用此模式打开将引发异常 |
| 'a' | 以写入模式打开,如果文件存在,则在末尾追加写入 |
| 'b' | 以二进制模式打开文件 |
| 't' | 以文本模式打开(默认) |
| '+' | 可读可写模式(可添加到其他模式中使用) |
| 'U' | 通用换行符支持 |
使用open()函数打开一个一个文件之后,返回一个文件对象,拿到这个文件对象,就可以读取或者修改这个文件:
[root@localhost home]# touch read.txt
[root@localhost home]# python
Python 3.5.3 (default, Jul 8 2017, 13:46:38)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('read.txt', 'r')
我们自己创建一个文件,然后用open()函数打开,看一下没有报错吧。没有报错就说明文件成功打开。
1.2 文件对象的方法
打开文件并取得文件对象之后,就可以利用文件对象的一些方法对文件进行读取或修改操作等。如下表列举了一些文件对象方法:
| 文件对象的方法 | 执行操作 |
|---|---|
| close() | 关闭文件 |
| read(size==-1) | 从文件读取size个字符,当未给定size或给定负值的时候,读取剩余的所有字符,然后作为字符串返回 |
| readline | 从文件中读取一整行字符串 |
| write(str) | 将字符串str写入文件 |
| writelines(seq) | 向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象 |
| seek(offset,from) | 在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节 |
| tell | 返回当前在文件中的位置 |
这里先简单的看几个例子:
[root@localhost home]# vi read.txt
Hello Python3v
[root@localhost home]# python
Python 3.5.3 (default, Jul 8 2017, 13:46:38)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('read.txt', 'r')
>>> print(f.read())
Hello Python3v
>>> f.close()
>>> print(f.read())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
为什么会有报错,是因为文件关闭之后还对文件操作。
1.3 文件的关闭
close()方法用于关闭文件,在Python中关闭文件是非常重要的。因为Python拥有垃圾收集机制,会在文件对象的引用计数降至零的时候自动关闭文件,所以如果忘记关闭文件并不会造成内存泄漏的危险。
不是因为不会造成泄漏就可以不用关闭,是因为Python可以在缓存你写入的数据,如果中途发生断电之类的事情,那么缓存数据就不会写入文件,所以,为了安全起见,要养成使用完文件后立刻关闭。
1.4 文件的读取和定位
文件的读取很简单,可以使用文件对象的read()和readline()方法,也可以直接使用list(f),或直接使用迭代来读取。read()是按自己为单位读取,如果不设置参数,那么会全部读取出来,文件指针指向文件末尾。tell()方法可以告诉你当前指针所在的位置。
>>> f = open('read.txt', 'r')
>>> print(f.read())
Python3v
>>> f.tell()
8
文件的指针你可以理解为,它是一个‘书签’,起到定为的作用。使用seek()方法可以调整文件指针的位置。seek(offset, from)方法有两个参数,表示从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset字节,因此文件指针设置到起始位置,使用seek(0, 0)即可:
>>> f = open('read.txt', 'r')
>>> print(f.read())
Python3v
>>> f.tell()
8
>>> f.seek(0,0)
0
>>> f.read(6)
'Python'
>>> f.tell()
6
我建好文件在文件里添加到Python3v。注:如果是中文字符,1个中文字符占用2个字节
readline()方法用于在文件中读取一整行,就是从文件指针的位置向后读取,直到遇到字符串(\n)结束。
为了举例,我在文件中添加了一些内容:
>>> f = open('read.txt', 'r')
>>> f.tell()
0
>>> f.readline()
'Python3v\n'
>>> f.tell()
9
>>> f.readline()
'Python\n'
>>> f.tell()
16
>>> f.readline()
'Hello\n'
>>> f.tell()
22
liest()方法读取文件,前提是文件的指针不是在末尾。如果指针式在末尾的话list()方法读取的就是空列表。
>>> list(f)
[]
>>> f.seek(0,0)
0
>>> list(f)
['Python3v\n', 'Python\n', 'Hello\n']
对于迭代读取文件,可能会用上面的list()方法,然后循环列表,这样效率不高。文件自身是支持迭代的,所以没必要绕圈子,直接使用for循环语句,把内容迭代读取即可:
>>> f.seek(0,0)
0
>>> for i in f:
... print(i)
...
Python3v
Python
Hello
1.5 文件的写入
如果想写入文件,就需要打开文件,打开模式只有‘w’和’a‘,否则会报错:
>>> f = open('read.txt', 'a')
>>> f.write('这是追加的数据')
7
>>> f.close()
>>> f = open('read.txt', 'r')
>>> f.read()
'Python3v\nPython\nHello\n这是追加的数据'
也可以使用‘r+’或者‘w+’
>>> f = open('read.txt', 'r+')
>>> f.write('这是追加的数据')
7
>>> f.close()
>>> f = open('read.txt', 'r+')
>>> f.read()
'这是追加的数据\n这是追加的数据'
>>> f = open('read.txt', 'w+')
>>> f.write('这是追加的数据')
7
>>> f.read()
''
>>> f.seek(0,0)
0
>>> f.read()
'这是追加的数据'
这里需要注意以下,使用‘r+’、‘w+’和‘w’都是覆盖数据,删除原来的数据了。如果不想删除原来的数据只能用‘a’追加
评论列表