File descriptor(文件描述符)
fd文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
一,File对象
python的文件对象File类是实现C的stdio包,并且可以通过内建方法open()来创建(同样可以使用内建方法file()来创建)。当文件操作引发错误时会抛出IOError。
1 类的方法
1.1 close():关闭文件流操作。当文件被关闭后就不能对其进行读写操作,如果依然进行的话会引发ValueError。close()可多次调用。
1.2 fulsh():冲刷内部缓存区。并不是一个必须的操作。
1.3 fileno():以数字形式返回“文件描述符”(
file descriptor
)。
1.4 isatty():
文件是否是一个终端设备文件。
1.5 next():返回下一行内容,并把操作标记置于下行开头。如 for line in file: print line 就是调用了next()方法。
1.6 read([size]):无参数或size是负数时,从文件中读取所有数据直到EOF,size为正数
时从文件中读取size个byte。
1.7 readline([size]):无参数时,读取一行。
size为正数
时从文件中读取size个byte。
1.8 readlines([sizehint]):把文件中的每一行最为一个列表的元素,返回这个列表。
1.9 seek(offset[, whence]):
将文件的操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0(os.SEEK_SET)表示从头开始计算(默认为0),1(os.SEEK_CUR)表示以当前位置为原点计算。2(os.SEEK_END)表示以文件末尾为原点进行计算。
1.10 tell():返回相对于开头记为0的文件当前的位置。
1.11 truncate([size]):裁剪文件的大小,如果size比文件本身还大,那根据不同的文件系统而定。size是byte。
1.12 write(str):写入文件内容。
1.13 writelines(sequence):写入文件内容,sequence是所有包含string信息的sequence。
2 类的属性
2.1 closed:标记文件是否已经关闭,由close()改写此标记
2.2
encoding:文件编码
2.3 error:随着encoding使用的编码错误处理
2.4
mode:打开模式
2.5 name:文件名
2.6 newlines:文件中用到的换行模式
文件的mode含义:
主要三种mode:r(只读),w(只覆盖写),a(只追加写)。这三种mode之间不能结合使用,而b和+需要配合前三种mode使用,不能独立使用。
添加‘b’到mode参数中,将对文件以二进制形式操作。添加‘+’到mode参数中,将允许对文件同时进行读写操作。
mode值
|
mode含义 |
r
|
以只读方式打开文件,写文件和文件不存在时会抛出IOError。
|
w
|
以只写方式打开文件,读文件时会抛出IOError。
文件不存在会创建文件,文件存在时写入会把原有内容覆盖。
|
a
|
以追加写方式打开文件,读文件时会抛出IOError。
文件不存在会创建文件,文件存在时写入追加到文件末尾。
|
r+
|
以读写方式打开文件,文件不存在会抛出IOError。
文件存在时写入会把原有内容覆盖。
|
w+
|
以读写方式打开文件,可以读取文件信息。
文件不存在会创建文件,文件存在时写入会把原有内容覆盖。
|
a+
|
以追加读写方式打开文件,可以读取文件信息。
文件不存在会创建文件, 文件存在时写入追加到文件末尾 。
|
rb/rb+
|
与r/r+类似,只是文件以二进制形式打开。
|
wb/wb+ |
与w/w+类似,只是文件以二进制形式打开。
|
ab/ab+
|
与a/a+类似,只是文件以二进制形式打开。
|
二,tempfile
用于创建临时文件和目录。其他程序无法找到和打开这个临时文件,关闭后会自动删除。
模块的函数:
1 TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]]) :返回一个类似于file的对象。当这个返回的对象调用close()方法后这个临时文件就会消失。mode默认是可读写二进制打开,如果要换成文本类型打开可以使用w+t
tmepf = tempfile.TemporaryFile()
tmepf.writelines(('ni\n', 'hao\n'))
tmepf.seek(0)
print tmepf.readline()
print tmepf.name
|
2 NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]]):与
TemporaryFile()函数一样,只是可函数返回的类file对象可以通过其名字被其他程序访问
3
SpooledTemporaryFile
([
max_size=0
[,
mode='w+b'
[,
bufsize=-1
[,
suffix=''
[,
prefix='tmp'
[,
dir=None
]]]]]]):
与
TemporaryFile()函数一样,只是这个临时文件内容保存在内存中直到其大小超过max_size。
4
mkstemp
([
suffix=''
[,
prefix='tmp'
[,
dir=None
[,
text=False
]]]]):创建一个临时文件,返回一个二元元组,第一个元素是操作临时文件的安全级别(os-level handle),第二个元素是临时文件的全路径。
参数suffix和prefix分别表示临时文件名称的后缀和前缀;dir指定了临时文件所在的目录,如果没有指定目录,将根据系统环境变量
TMPDIR
,
TEMP
或者
TMP
的设置来保存临时文件;参数text指定了是否以文本的形式来操作文件,默认为False,表示以二进制的形式来操作文件。和
TemporaryFile不同,需要用户自己删除这个临时文件。
fd, filename = tempfile.mkstemp()
print fd, filename
os.close(fd)
os.remove(filename)
|
5
mkdtemp([suffix=''[, prefix='tmp'[, dir=None]]]):创建临时目录,也需要用户自己删除这个临时目录。
6
gettempdir():返回存放临时文件的目录。
模块属性:
1
tempdir:返回存放临时文件的目录。
如果没有设置该属性或者将其设为None,Python将返回以下环境变量TMPDIR, TEMP, TEMP指定的目录,如果没有定义这些环境变量,临时文件将被创建在当前工作目录。
三,shutil
此模块提供文件集的一些高级操作。
1 目录和文件操作
1.1
copyfileobj
(
fsrc
,
fdst
[,
length
]):将目标类文件对象fsrc拷贝到目的类文件对象fdst。当给定length时则表示指定buffer的size。fsrc必须具有读模式,fdst必须具有写模式或追缴模式。
1.2 copyfile(src, dst):把目标文件源src拷贝到目标文件源dst,如果dst已经存在就覆盖。如果src和dst是同一文件会抛出异常,dst必须有写权限。
1.3 copymode(src, dst):把权限位从src拷贝到det。
1.4 copystat(src, dst):拷贝权限位,最后访问时间和修改时间。
1.5 copy(src, dst):把文件src拷贝到文件dst或者目录dst中。权限位会被拷贝。如果dst为目录则把文件拷贝到dst目录中,如果存在src同名文件就覆盖之。
1.6 copy2(src, dst):类似于 cp -p命令。是copy + copystat,在拷贝文件内容的同时拷贝最后访问时间和修改时间。
1.7 copytree(src, dst, symlinks=False, ignore=None):把src递归拷贝到dst,如果symlinks是True,则复制目录时将保持文件夹下的符号连接,如果symlinks是False,则将在复制的目录下生成物理副本来替代符号连接。src和dst必须为目录,且dst必须不存在。
1.8 rmtree(path[, ignore_errors[, onerror]]):删除整个目录树。
1.9 move(src, dst):递归移动一个文件或者一个目录(src)到目标文件或目录dst,类似于剪切。dst如为文件当src文件和dst文件同名时覆盖dst文件;dst如为目录必须不存在。
2 归档操作
2.1 make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]):创建一个归档文件(如zip和tar),并返回其名字。
base_name是生产的归档文件的全路径及名字,format是归档格式,如zip,tar,bztar,gztar;root_dir是归档文件的跟目录;base_dir是归档文件的来源,root_dir和base_dir的默认目录都是当前目录。
2.2
get_archive_formats
():返回一个系统所支持的归档类型的列表,其中元素为简称和说明的元组。
2.3
register_archive_format
(
name
,
function
[,
extra_args
[,
description
]]):注册一个新的归档类型。
2.4
unregister_archive_format
(
name
):注销一个归档类型。
四,os.path
此模块实现了对路径名称很有用的函数。
模块的函数
1. abspath(path):返回path的绝对路径。
import os.path as op
print op.abspath(r"./")
|
2. basename(paht):返回path的文件名。
3. dirname(path):返回path的目录名。
4. exists(path):判断某个目录或文件是否存在,True为存在。
5. lexists(path):
如果 path 与一个已存在的路径关联返回 True 。对于损坏的连接返回 True 。在一些缺少 os.lstat()的平台上相当于exists()。
6. expanduser(path):把~和~user的path换成用户的home目录。
7. expandvars(path):环境变量值替换path内的变量,linux中以$name和${name}表示,Windows中是以%name%表示。
8. getatime(path):返回最后一次进入该path的时间戳。
9. getmtime(path):返回最后一次在该path下修改的时间戳。
10. getctime(path):返回该path对应的文件或目录的创建时间戳。(Unix上是最后一次修改时间)。
11. getsize(path):文件大小,目录大小是固定的,单位字节。
12. isabs(path):是否是绝对路径。
13. isfile(path):是否为文件。
14. isdir(path):是否为目录。
15. islink(paht):是否为连接。
16. ismount(path):是否为挂载点。
17.
join
(
path1
[,
path2
[,
...
]]):合成路径,形成新目录或文件。
18. normcase(path):转换目录内的大小写,斜杠等特殊符号。
19. normpath(path):规范的path字符串形式。
20. realpath(path):如果是相对路径,则返回当前目录下的绝对路径(os.curdir)。
21. samefile(path1, path2):判断两个目录或文件是否是同一个,适用于Unix。
22. split(path):返回包含目录和文件名的元组。
23. splitdrive(path):用于Windows下,将驱动器(如C盘,C:)与之后的路径分开。
24. splitext(path):分割路径,返回文件名和扩展文件名的元组。
25. splitunc(path):分割加载点和文件。
26. walk(path, visit, arg):遍历path,进入每个目录都调用visit函数,visit函数必须有3个参数(arg, dirname, names),dirname表示当前目录的目录名,names代表当前目录下的所有文件名,args则为walk的第三个参数。
五,在os模块中的部分文件操作
1
File descriptor的相关操作(fd)
1.1 close(fd):关闭fd对应的文件对象。
1.2 dup(fd):返回一个fd的副本。
1.3 fsync(fd):将fd所指向的文件对象刷新如硬盘。
1.4 open(file, flag[, mode]):打开一个文件对象并返回fd。
flag含义(Windows和Unix都能用的,其他的并未给出,请参考python的具体文档):
os.O_RDONLY
|
以只读的方式打开 Read only
|
os.O_WRONLY
|
以只写的方式打开 Write only
|
os.O_RDWR
|
以读写的方式打开 Read and write
|
os.O_APPEND
|
以追加的方式打开
|
os.O_CREAT
|
创建并打开一个新文件
|
os.O_EXCL
|
os.O_CREAT| os.O_EXCL 如果指定的文件存在,返回错误
|
os.O_TRUNC
|
打开一个文件并截断它的长度为零(必须有写权限)
|
1.5 read(fd, n):读取fd所对应的文件,n为读取的最多字节数。
1.6 write(fd, str):对fd所对应的文件对象进行写入,内容为str。
1.7
lseek
(
fd
,
pos
,
how
):
将fd所对应的文件的操作标记移到pos的位置。这个pos一般是相对于文件的开头来计算的,一般为正数。但如果提供了
how
参数就不一定了,
how
可以为0(
os.SEEK_SET
)表示从头开始计算(默认为0),1(
os.SEEK_CUR
)表示以当前位置为原点计算。2(
os.SEEK_END
)表示以文件末尾为原点进行计算。
1.8
fdopen
(
fd
[,
mode
[,
bufsize
]]):返回一个fd对应的文件对象。和内建函数open类似。
2 另外一些文件操作
2.1 sep:当前操作系统的路径分割符。
2.2 name:当前的操作系统。
2.3 linesep:当前操作系统的行换行符。
2.4 listdir(path):返回指定path下的所有文件和目录名称列表。
2.5 getcwd():返回当前的目录字符串。
2.6 remove(path):删除一个文件,如果是目录就会抛出OSError。
2.7 removedirs(path):只能删除目录,会试图删除path目录上的每个节点(每个空目录),知道有OSError为止。
2.7 rmdir(path):只能删除空目录,删除非空文件shuitl.
rmtree。
2.8 rename(src, dst):把文件或目录重命名。
2.9 stat(path):获得文件或目录的属性。
2.10
mkdir
(
path
[,
mode
]):创建一个名为path的目录,mode为Unix系统中文件的数字化权限,默认值为0777。
2.11 makedirs(path[, mode]):递归创建多层目录。