文章内容

2017/9/22 10:50:32,作 者: 黄兵

Python 文件操作 永久存储(一)

1.文件:因为你懂,所以永恒

大多数的程序都遵循着:输入=》处理=》输出的模型,首先接收输入数据,然后按照要求进行处理,最后就是输出数据。在编写代码的时候,操作系统未来更快地做出响应,把当前的数据都放在内存中,那是因为内存和CPU数据传输的速度比在硬盘和CPU之间传输的速度快很多倍。但是内存有一个不足就是,一旦断电,内存中的数据就会丢失。所以在这里提醒大家在写代码的时候一定要习惯保存,这是用window的经验之谈。

1.1 打开文件

在Python中,使用open()函数打开文件并返回文件对象:

  1. open(file, mode = 'r', buffering = -1, encoding = None, errors = None, newline = None, closed = True, opener = None)

open()函数有很多参数,这里只需要关注第一个和第二个参数就好。第一个参数是出入的文件名,第二个参数是打开方式。如果第一个参数只是一个文件名表示打开的是当前目录下的文件,如果是路径的话表示路径下的文件,不过要是打开的文件不存在呢?看一下例子:

  1. [root@localhost home]# python  

  2. Python 3.5.3 (default, Jul  8 2017, 13:46:38)

  3. [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux

  4. Type "help", "copyright", "credits" or "license" for more information.

  5. >>> f = open('read.txt', 'r')

  6. Traceback (most recent call last):

  7.  File "<stdin>", line 1, in <module>

  8. FileNotFoundError: [Errno 2] No such file or directory: 'read.txt'

看到报错信息了吧,提示文件不存在。

下面是第二个参数的打开模式,如下表

打开模式执行操作
'r'以只读方式打开文件(默认)
'w'以写入的方式打开文件,会覆盖已存在的文件
'x'如果文件已经存在,使用此模式打开将引发异常
'a'以写入模式打开,如果文件存在,则在末尾追加写入
'b'以二进制模式打开文件
't'以文本模式打开(默认)
'+'可读可写模式(可添加到其他模式中使用)
'U'通用换行符支持

使用open()函数打开一个一个文件之后,返回一个文件对象,拿到这个文件对象,就可以读取或者修改这个文件:

  1. [root@localhost home]# touch read.txt

  2. [root@localhost home]# python        

  3. Python 3.5.3 (default, Jul  8 2017, 13:46:38)

  4. [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux

  5. Type "help", "copyright", "credits" or "license" for more information.

  6. >>> 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返回当前在文件中的位置

这里先简单的看几个例子:

  1. [root@localhost home]# vi read.txt

  2. Hello Python3v

  3. [root@localhost home]# python      

  4. Python 3.5.3 (default, Jul  8 2017, 13:46:38)

  5. [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux

  6. Type "help", "copyright", "credits" or "license" for    more information.

  7. >>> f = open('read.txt', 'r')

  8. >>> print(f.read())

  9. Hello Python3v

  10. >>> f.close()

  11. >>> print(f.read())

  12. Traceback (most recent call last):

  13.  File "<stdin>", line 1, in <module>

  14. ValueError: I/O operation on closed file.

为什么会有报错,是因为文件关闭之后还对文件操作。

1.3 文件的关闭

close()方法用于关闭文件,在Python中关闭文件是非常重要的。因为Python拥有垃圾收集机制,会在文件对象的引用计数降至零的时候自动关闭文件,所以如果忘记关闭文件并不会造成内存泄漏的危险。

不是因为不会造成泄漏就可以不用关闭,是因为Python可以在缓存你写入的数据,如果中途发生断电之类的事情,那么缓存数据就不会写入文件,所以,为了安全起见,要养成使用完文件后立刻关闭。

1.4 文件的读取和定位

文件的读取很简单,可以使用文件对象的read()和readline()方法,也可以直接使用list(f),或直接使用迭代来读取。read()是按自己为单位读取,如果不设置参数,那么会全部读取出来,文件指针指向文件末尾。tell()方法可以告诉你当前指针所在的位置。

  1. >>> f = open('read.txt', 'r')

  2. >>> print(f.read())

  3. Python3v

  4. >>> f.tell()

  5. 8

文件的指针你可以理解为,它是一个‘书签’,起到定为的作用。使用seek()方法可以调整文件指针的位置。seek(offset, from)方法有两个参数,表示从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset字节,因此文件指针设置到起始位置,使用seek(0, 0)即可:

  1. >>> f = open('read.txt', 'r')

  2. >>> print(f.read())          

  3. Python3v

  4. >>> f.tell()                

  5. 8

  6. >>> f.seek(0,0)              

  7. 0

  8. >>> f.read(6)

  9. 'Python'

  10. >>> f.tell()  

  11. 6

我建好文件在文件里添加到Python3v。注:如果是中文字符,1个中文字符占用2个字节

readline()方法用于在文件中读取一整行,就是从文件指针的位置向后读取,直到遇到字符串(\n)结束。

为了举例,我在文件中添加了一些内容:

  1. >>> f = open('read.txt', 'r')

  2. >>> f.tell()

  3. 0

  4. >>> f.readline()

  5. 'Python3v\n'

  6. >>> f.tell()    

  7. 9

  8. >>> f.readline()

  9. 'Python\n'

  10. >>> f.tell()    

  11. 16

  12. >>> f.readline()

  13. 'Hello\n'

  14. >>> f.tell()    

  15. 22

liest()方法读取文件,前提是文件的指针不是在末尾。如果指针式在末尾的话list()方法读取的就是空列表。

  1. >>> list(f)

  2. []

  3. >>> f.seek(0,0)

  4. 0

  5. >>> list(f)    

  6. ['Python3v\n', 'Python\n', 'Hello\n']

对于迭代读取文件,可能会用上面的list()方法,然后循环列表,这样效率不高。文件自身是支持迭代的,所以没必要绕圈子,直接使用for循环语句,把内容迭代读取即可:

  1. >>> f.seek(0,0)

  2. 0

  3. >>> for i in f:

  4. ...     print(i)

  5. ...

  6. Python3v

  7. Python

  8. Hello

1.5 文件的写入

如果想写入文件,就需要打开文件,打开模式只有‘w’和’a‘,否则会报错:

  1. >>> f = open('read.txt', 'a')

  2. >>> f.write('这是追加的数据')

  3. 7

  4. >>> f.close()

  5. >>> f = open('read.txt', 'r')

  6. >>> f.read()                

  7. 'Python3v\nPython\nHello\n这是追加的数据'

也可以使用‘r+’或者‘w+’

  1. >>> f = open('read.txt', 'r+')

  2. >>> f.write('这是追加的数据')

  3. 7

  4. >>> f.close()                

  5. >>> f = open('read.txt', 'r+')

  6. >>> f.read()

  7. '这是追加的数据\n这是追加的数据'

  8. >>> f = open('read.txt', 'w+')

  9. >>> f.write('这是追加的数据')

  10. 7

  11. >>> f.read()

  12. ''

  13. >>> f.seek(0,0)              

  14. 0

  15. >>> f.read()  

  16. '这是追加的数据'

这里需要注意以下,使用‘r+’、‘w+’和‘w’都是覆盖数据,删除原来的数据了。如果不想删除原来的数据只能用‘a’追加

分享到:

发表评论

评论列表