python基础知识-文件操作(下)

本文作者:黎智煊,叩丁狼高级讲师。原创文章,转载请注明出处。

刚刚已经演示了简单的文件读取和关闭,但是这些操作都是基于最基本的ASCII字符集下操作的.但是,通用我们还是需要和unicode打交道的,比如说我们的中文.所以,现在说一下关于编码的一些问题.

中文编码

Python 文件中如果未指定编码,在执行过程会出现报错:

在python2中,如果不指定编码的话,如果输出的字符集不是ascii就很报错.

#!/usr/bin/python
print "你好,世界";
#以上程序执行输出结果为:

  File "test.py", line 2
SyntaxError: Non-ASCII character '\xe4' in file test.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

注意:

Python3.X 源码文件默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码。

字符编码

要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

>>> f = open('/home/wolfcode/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'

遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

>>> f = open('/home/wolfcode/gbk.txt', 'r', encoding='gbk', errors='ignore')

多行文件的读取.

上文讲了简单的单行读取,现在讲一下大文件的读取和多行的读取.
就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素

f = open('test.txt', 'r')
content = f.readlines()
print(type(content))
i=1
for temp in content:
    print("%d:%s"%(i, temp))
    i+=1
f.close()

利用readlines可以读取大文件,例如,你的内存只有2G,但是你现在需要读取一个超过4G的单文件,就可以使用readlines来制定范围去读取.

写文件

写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件:

>>> f = open('/home/wolfcode/gbk.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()

你可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险:

with open('/home/wolfcode/gbk.txt', 'w') as f:
    f.write('Hello, world!')

要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码。

细心的童鞋会发现,以'w'模式写入文件时,如果文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。如果我们希望追加到文件末尾怎么办?可以传入'a'以追加(append)模式写入。

File对象的属性
一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息。

以下是和file对象相关的所有属性的列表:

属性 描述

file.closed| 返回true如果文件已被关闭,否则返回false。
file.mode |返回被打开文件的访问模式。
file.name |返回文件的名称。
file.softspace |如果用print输出后,必须跟一个空格符,则返回false。否则返回true。
如下实例:

#!/usr/bin/python
# 打开一个文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
print "是否已关闭 : ", fo.closed
print "访问模式 : ", fo.mode
print "末尾是否强制加空格 : ", fo.softspace
以上实例输出结果:

文件名:  foo.txt
是否已关闭 :  False
访问模式 :  w
末尾是否强制加空格 :  0

文件定位

tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。

seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。

如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。

例子:

就用我们上面创建的文件foo.txt。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开一个文件
fo = open("/home/wolfcode/gbk.txt", "r+")
str = fo.read(10)
print "读取的字符串是 : ", str

# 查找当前位置
position = fo.tell()
print "当前文件位置 : ", position

# 把指针再次重新定位到文件开头
position = fo.seek(0, 0)
str = fo.read(10)
print "重新读取字符串 : ", str
# 关闭打开的文件
fo.close()
以上实例输出结果:

读取的字符串是 :  www.wolfco
当前文件位置 :  10
重新读取字符串 :  www.wolfco
python基础知识-文件操作(下)_第1张图片
叩丁狼教育.jpg

你可能感兴趣的:(python基础知识-文件操作(下))