python学习之路02(对文件的各种操作)

第二部分-----------python 的文件读写操作:http://www.cnblogs.com/emily-qin/p/7001053.html

一、open函数:

1、语法:

    open(file_name[,access_model][,buffering])---

    file_name--要访问的文件路径及文件名称的字符串值。尽量使用绝对路径。

    access_model--打开文件的方式。默认为只读方式(r),w:写之前会清空文件的内容,a:追加的方式

    buffering-----先写到缓存中。值为0,就不会有寄存,值为1,访问文件时会缓存行,值大于1的正式,则这就是寄存区的缓冲大                       小,值为负值,寄存区的缓冲大小为系统默认。

     返回值:file_object 是一个指向文件的指针(一个文件对象)文件句柄。

2、mode文件操作模式:

r,w,a

r+:可读可写 ,

w+:打开一个文件用于读写,若文件已存在,将其覆盖,不存在,创建新文件,

a+: 打开一个文件用于读写,若文件已存在,文件指针将会在文件结尾。文件打开是会是追加模式。不存在,创建新的文件用于读写。

rb ,wb,ab:用于二进制的读写。

实例1:

import os#导入系统模块
#os.getcwd()#查看当前路径
#os.chdir('D:\\')#更改至d盘
fp=open('D:\\011.txt','w')
fp.write('belle ddd ')
fp.close()
结果:在D盘下,创建了011.txt文件,并在里面写入  belle  ddd  最后保存关闭。

实例2:

import os
os.getcwd()
os.chdir('d:\\')
fp1=open('a011.txt','w',encoding='utf8')
a011 =['chinese ','math ','english ']
fp1.writelines(a011)#writelines的参数是序列,如列表,而write的参数是一个字符串
fp1.flush()
add= ['bio ','che ','php ']
fp1=open('a011.txt','a',encoding='utf8')
fp1.writelines(add)
fp1.flush()
fp1.close()


3、通过open获取文件句柄可以进行文件的其他操作

(1)fp.closed---判断文件是否关闭,true-已经关闭,否则为false

     fp.close---刷新还没有写入的信息,关闭文件

(2)fp.name---返回文件名称

(3)fp.mode---输入读写模式,返回被打开文件的访问模式

(4)fp.softspace---如果用print输出后,是否跟一个空格符,false不打印,true打印

(5)flush

把缓存中的内容持久化写到磁盘里,缓存区写满的情况,系统会自动调用flush()方法,

调用flush的时机:写入多少长度的数据,或者间隔多少时间,

如果没有flush(),持久化内容会丢失。

(6)next()   ----------------------- (还不太会用)

# for i in fp:
# print i
把一个file用for...in file这样的循环遍历语句时,就是调用next()函数来实现。
 
fp=open(fileName,'r')
print fp.next()
print fp.next()

print fp.fileno() 判断当前操作的文件句柄是哪一个number

fp.close()
 
(7)裁剪文件truncate([size])
用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,则从当前位置起截断;截断之后 size 后面的所有字符被删除。
如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
fp='e:\\tmp\\03.txt'
 
f1=open(fp,'r+')
line=f1.readline()
print line
 
f1.truncate()
print f1.tell()
f1.close()

二、对文件作读写操作

1、常规的读写操作

(1)read([size])
size:读取的长度,以byte为单位。如果不指定参数,表示一次性读取全部内容,以字符串形式返回,并且每一行结尾会有一个"\n"符号。
 
(2)、readline([size])
调一次读取一行,如果给定了size,有可能返回的只是一行的一部分,以字符串的形式返回,并且结尾会有一个换行符"\n"。读完一行,文件操作标记移动到下一行的开头。
返回的是字符串
 
(3)、readlines([size])
(3.1)参数
size:指定很小的数字,会不生效,python 默认8k缓存区大小,需要大于8k生效
读取文件的全部内容,这个函数的内部是通过循环调用readline()来实现的
(3.2)返回值
返回的是列表格式,每一行是列表的一个元素,并且结尾会有一个换行符"\n"
 
(4)、writelines(seq)
seq:把seq(序列)的内容全部写到文件中(多行一次性写入)。也不会自动加入换行符。
注意:序列中的内容也必须是字符串类型的数据,才能成功写入文件。
 
(5)、write(str)
把str写到文件中,默认是不加换行符的,所以如果想换行的话,得手动加入换行符'\n'。
 

2、使用linecache模块读取文件

import linecache
允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行。
(1)linecache.getlines(filename,lineno)
从名为 filename 的文件中得到第 lineno 行。
这个函数从不会抛出一个异常–产生错误时它将返回”(换行符将包含在找到的行里)。
如果文件没有找到,这个函数将会在 sys.path 搜索。
(2)linecache.getlines(filename) 返回列表
从名为 filename 的文件中得到全部内容,输出为列表格式,以文件每行为列表中的一个元素,并以 linenum-1 为元素在列表中的位置存储
(3)linecache.clearcache()
清除缓存,如果你不再需要先前从 getline() 中得到的行
(4)linecache.checkcache([filename])
检查缓存的有效性。如果在缓存中的文件在硬盘上发生了变化,并且你需要更新版本,使用这个函数。
如果省略 filename,将检查缓存里的所有条目。
(5)linecache.updatecache(filename)
更新文件名为 filename 的缓存。如果 filename 文件更新了,使用这个函数可以更新
linecache.getlines(filename)返回的列表。
 
另:读取文件之后你不需要使用文件的缓存时需要在最后清理一下缓存,使linecache.clearcache()清理缓存,释放缓存。
这个模块是使用内存来缓存你的文件内容,所以需要耗费内存,打开文件的大小和打开速度和你的内存大小有关系。
打印奇数行的文件:
fp='e:\\tmp\\05.txt'
list1=linecache.getlines(fp)
for i in list1[::2]:
print i

 
3、pickle模块和cPickle模块

对文件整体的读写
(1)pickle模块(Python提供一个标准的模块)
列表内容持久存储到内存中
使用它你可以在一个文件中储存任何Python对象,之后你又可以把它完整无缺地取出来。这被称为持
久地储存对象(序列化)
(2)cPickle 列表和文件内容的转换
它的功能和pickle模块完全相同,只不过它是用C语言编写的,因此要快得多(比pickle快1000倍),推荐使用。
import cPickle as p
p.dump(list,fp) 把列表list内容保存到内存中,存入一个文件(这个文件带有cPickle特有的格式)中
fp:打开的文件句柄,如:fp=open('d:\\tmp\\test1.txt','wb')
list=p.load(fp) 把之前存放在文件中的内容保存到列表list中
 

三、读取文件的位置定位

1、tell()
返回当前操作文件读取到的位置
一个中文:3个字节
Windows下‘\r\n’(换行符)占两个字节,Linux下\n mac下\r.
2、seek(offset[,from]) 移动游标到想去的位置
from:,默认是0,2:从末尾开始计算偏移;1:从当前位置作为标准位置
offset:移动的总距离,可以是正数,可以为负数

猜你喜欢

转载自blog.csdn.net/bellediao/article/details/79912277