python中的文件操作

来源:互联网 发布:怎么做产品的网络推广 编辑:程序博客网 时间:2024/06/06 16:34

注意:以下文件操作适用的python版本为2.7.X,与python3.X有些不同。

文件打开

在python中打开一个文件open(filepath,[mode],[buf])

参数说明:

filepath:  文件路径
mode:     文件的打开方式(只读、只写、可读可写,默认是只读)
buf:         缓冲区的大小,默认为0,表示不缓冲(字节)
Python文件打开方式(mode)可取以下值:
'r' 只读方式打开 文件必须存在
'w' 只写方式打开 文件不存在则创建文件,文件存在则覆盖原来内容
'a' 追加方式打开 文件不存在创建文件
'r+'/'w+' 读写方式打开
'a+' 追加和读写方式打开
'rb','wb','ab',‘rb+','wb+','ab+' 二进制方式打开

例如:

f = open("hello.py",'r',1)

文件读取

read函数读取

read([size]):读取文件
如果设置了 size 而且文件大小大于size,那么读取size个字节,如果未设置size则默认读取全部。
readline([size]):读取一行
readlines([size]):读取文件,返回每一行所组成的列表(如果文件很大,会占用很大内存,一般不推荐使用)
系统不是精确的按照size读取文件,只会读出和io.DEFAULT_BUFFER_SIZE相近的字节数(io.DEFAULT_BUFFER_SIZE是io包中定义的一个常量数值为8k)。
注意(在python2.X中):
1:readlines的参数是字节数,不是行数
2:如果不加参数,默认把文件读完,
3:参数小于io.DEFAULT_BUFFER_SIZE,则读出字节数接近于io.DEFAULT_BUFFER_SIZE(8K的一倍值)
4:如果输入的值大于io.DEFAULT_BUFFER_SIZE,读出字节数接近于io.DEFAULT_BUFFER_SIZE的倍数的字节数。

用迭代器读取文件

iter_f = iter(file)for line in iter_f:    count += 1


这样就得到了文件的行数,迭代器不必将文件一次读取到内存中,可以在不使用大量内存的情况下,遍历整个文件。


文件写入

文件写入方式:
write(str):将字符串写入文件
write(sequence_of_strings):写多行到文件
如果文件是用只写或者读写方式打开,新写的内容会覆盖掉文件原来的内容!如果文件要多次打开多次写入而保留原来的内容,就要使用追加的方式打开。调用写函数后,不会立刻序列化到磁盘上,而是先放在内存中的缓冲区中。
当关闭文件close()或者调用flush()以后会写到磁盘上。如果写入的数量过大,大于缓存空间,也会将缓存写入磁盘。


文件关闭

使用完文件以后要调用file.close()关闭文件,释放资源。理由如下:

1.将写缓存同步到磁盘
2.linux系统中每个进程打开的文件个数是有限的
3.如果打开文件数到了系统限制,在打开文件就会失败。会报错。
进程限制的打开文件数可以在 /proc/{进程号}/limits 文件中查看,可以通过file对象的 fileno() 方法来查看当前已经打开了多少文件。


文件指针

初学者在使用python读写文件的时候会发现两个问题:
1.写入文件以后必须重新打开文件才能读到刚才写入的内容
2.读取文件文件以后,读取过的内容不能再次读取
原因是在在文件读写过程中有一个叫做文件指针的东西在移动。当使用 open 函数打开一个文件时,文件指针指向文件的第一个字节。当调用 file.read(3) 后文件指针会向后移动三个字节,指向第四个位置。如果调用file.write('abcde')后文件指针会向后移动5个字节。在文件读写的过程中文件指针是自动根据字节数向后移动的。那么可否自己手动移动文件指针呢?答案是肯定的。
Python中文件指针操作通过seek函数来完成,具体格式为:
seek(offset,[whence])
offset 表示偏移量,可以取负数;
whence 表示偏移的相对位置,这个相对位置有三种取值:os.SEEK_SET(文件起始位置)、os.SEEK_CUR(文件当前位置)、os.SEEK_END(文件结尾位置)
比如,如果想让文件指针移到文件开始出可以这样写:

import osfile.seek(0,os.SEEK_SET)

注意:

1.调用 file.tell() 可以查看当前文件指针的位置(相对于文件开始处)
2.文件指针位置是从0开始的
3.使用seek移动指针时要注意不能越界,否则会报错


文件的编码格式

在用python操作文件时要注意文件编码格式的问题。python中提供了一些方法来查看打开文件的属性:
file.fileno() :文件描述符
file.mode     :文件打开权限
file.encoding :文件编码格式(默认的文件ascii码格式,不返回任何值)
file.closed   :文件是否被关闭(值为true或false)

f 的其它方法:

调用 write 函数向文件写入内容时,写的字符串的编码要和文件的编码相符合,如果不符合会写入失败。
比如问件 f 是ascii码格式,调用 f.write(u'中国') 会报错:ascii不支持unicode格式的写入。那么如何将 u'中国' 写入文件呢?可以将unicode转码成'utf-8'然后再写入!

a = unicode.encode(u'中国','utf-8')f.write(a)


我们可以用codecs模块提供的方法来创建一个我们自己想要的编码格式的文件。
codecs.open(fpath,mode,encoding,errors,buffering) 可以通过encoding参数设置以何种编码方式打开文件(默认为ascii编码)


os模块的使用

(首先要 import os)

使用os模块打开文件

os.open(filename,flag,[mode])
flag表示打开文件的方式,可以取值:
os.O_CREAT 创建文件
os.O_RDONLY 只读方式打开
os.O_WRONLY 只写方式打开
os.O_RDWR 读写方式打开
flag可以接收多个值的复合,比如以创建和读写的方式打开一个文件:
fd = os.open('test.txt',os.O_CREAT | os.O_RDWR)

os的其它方法:




使用os模块对文件进行操作

os.read(fd,buffersize) 读取文件
os.write(fd,string) 写入文件
os.lseek(fd,pos,how) 文件指针操作,第一个参数表示文件对象,第二个参数是偏移量,第三个参数是相对位置,第三个参数的取值同seek函数一样.(SEEK_SET/os.SEEK_CUR/os.SEEK_END)
os.close(fd):关闭文件

os.path 的常用方法:


1 0