标签:python
本篇博客将介绍Python的文件处理和相关输入输出,将涉及到文件对象(它的内建函数,内建方法和属性),标准文件和文件系统的访问方法,文件执行.(欢迎大家去我的新博客走走)
文件对象不仅可以用来访问普通的磁盘文件,也可以访问任何其他类型抽象层面上的”文件”.内建函数open()返回一个文件对象,对文件进行后续相关的操作都要用到它.
作为钥匙,内建函数open()和file()提供了初始化输入/输出(I/O)操作的通用接口.open()函数成功打开文件后会返回一个文件文件对象,若不成功,则抛出一个IOError异常.open()函数的语法如下:
file_object = open(file_name, access_mode="r", buffering=-1)
file_name 是将要打开文件的文件名,可以是相对路径或绝对路径.access_mode也是一个字符串,代表打开文件的模式,有”r”(代表读取),”w”(代表写入),”a”(代表追加).以”r”模式打开的文件必须是存在的.以”w”模式打开文件,若文件不存在则会创建,若文件已存在,则将该文件清空在写入数据.”a”模式和”w”类似,唯一的区别就是”a”是在文件的末尾添加数据的,不会清空文件原来存在的数据.若文件不存在,则创建它.access_mode默认为”r”.buffering用于指示访问文件所采用的缓冲方式.其中0表示不缓冲,1表示只缓冲一行数据,任何其他大于1的数值代表使用给定值作为缓冲区大小.不提供该参数或给负值代表使用系统默认的缓冲机制.更详细的看下图:
open()成功执行并返回一个文件对象之后,所有对该文件的后续操作都将通过这个句柄进行.文件方法有4类:输入, 输出, 文件内移动及迭代操作.
read()方法用来直接读取字节到字符串中,最多读取给定数目个字节.如何没有给定size参数(默认为-1)或者size值为负,文件将被读取直到末尾.
readline()方法读取文件一行,然后整行(包括行结束符),作为字符串返回.和read()方法类似,它也有一个可选的size参数,默认为-1,代表读到行结束.如果提供了该参数,例如5吧,则它只会读取该行的5个字符.
readlines()方法不像其他两个方法返回一个字符串.他会读取所有(剩余的)行然后把他们他们作为一个字符串列表返回.它的可选参数sizhint代表返回的最大字节大小.如果它大于0,那么返回的所有行应该有sizeint字节.
wirte()内建方法的功能与read()和readline()相反.它把含有文本数据或二进制数据块的字符串写入到文件中去.
和 readlines()一样, writelines()方法是针对列表的操作,它接受一个字符串列表作为参数,将他们写入文件中.但是行结束符不会自动加入,如果需要,你必须在调用writelines()钱给每行结尾加上行结束符.
seek()方法(类似与C中的fseek()函数)可以在文件中移动文件指针到不同的位置.offset字节代表相对于某个位置偏移量.位置的默认值为0,代表从文件开头算起(即绝对偏移量),1代表从当前位置算起, 2代表从文件末尾算起.
tell()方法是对seek()方法的补充;它告诉你当前文件指针在文件中的位置–从文件起始算起,单位为字节.
文件迭代让程序员访问文件是如此简单:
f = open("test.txt", "r")
for eachLine in f:
print eachLine
close()通过关闭文件来结束对它的访问.
fileno()方法返回打开文件的描述符.这是一个整数
调用flush()方法会直接把内部缓冲区中的数据立刻写入文件,而不是被动的等待输出缓冲区被写入.
上面扯了这么多,还是动手实践直观些,来写一些demo
>>> f = open("test", "r")
>>> fileno(f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name ‘fileno‘ is not defined
>>> f.fileno()
3
>>> f.tell()
0
>>> for eachLine in f:
... print eachLine,
...
This file just for test.
line 1
line 2@
line 3!
line 4*
end!!!
>>> f.tell()
65
>>> f.seek(0,0)
>>> f.tell()
0
>>>
>>> f = open("newfile", "w")
>>> f.write("This is a test")
>>> f.tell()
14
>>> f.writelines(["line1", "line2", "line3"])
>>> f.close()
>>> f = open("newfile", "r")
>>> for eachLine in f:
... print eachLine,
...
This is a testline1line2line3
>>>
文件对象除了方法之外,还有一些数据属性.这些属性保存了文件对象相关的附加数据.
文件对象的属性 | 描述 |
---|---|
file.closed | 表示文件以关闭 |
file.encodeing | 文件所使用的编码 |
file.mode | 文件打开时的访问模式 |
file.name | 文件名 |
file.newline | 为读取到行结束符是为None,只有一种行结束符是为一个字符串,当文件有多种行分隔符时,则为一个包含所有当前所遇到的行结束符的列表 |
标准文件有这3个:标准输入, 标准输出, 标准错误
Python中可以通过sys模块来访问这些文件的句柄.sys.stdin, sys.stdout, sys.error分别代表标准输入, 标准输出, 标准错误.通常来说,print语句是输出到sys.stdout, raw_input()是从sys.stdin接收输入.
相信熟悉C语言的同学对命令行参数比较熟悉,在C语言中,argc和argv分别代表参数个数和参数向量.argv变量代表从一个命令行上输入的各个参数组成的字符串数组;argc变量代表输入的参数个数.在Python中,argc是不存在的.Pyhton中的sys.argv相当与C的argv,而len(sys.argv)才相当于C中的argc.总之:
- sys.argv 是命令行参数的列表
- len(sys.argv) 是命令行参数的个数
看一个小例子:
##argvTest.py
import sys
print "you entered", len(sys.argv), "arguments..."
print "they were: ", str(sys.argv)
likai@likai:~/python$ python argvTest.py 43 test 44.44 haha
you entered 5 arguments...
they were: [‘argvTest.py‘, ‘43‘, ‘test‘, ‘44.44‘, ‘haha‘]
对文件系统的访问大多通过Python的os模块实现.该模块是Python访问操作系统功能的主要接口.os模块实际是只是真正加载的模块的前端,而具体的实现则依赖于具体的操作系统.
os模块可以对进程和进程运行环境进行管理,os模块还负责大部分的文件系统操作.当然本篇博客主要讲os的文件系统操作..这些操作包括删除/重命名文件,遍历目录树,以及管理文件权限等.
另一个模块os.path 可以完成一些针对路径名的操作.它提供的函数可以完成管理和操作文件路径名中的各个部分,获取文件或子目录信息,文件路径查询等功能.
函数 | 描述 |
---|---|
文件处理 | |
mkfifo()/mknod() | 创建命名管道/创建文件节点 |
remove()/unlink() | 删除文件 |
rename()/renames() | 重命名文件 |
stat() | 返回文件信息 |
sysmlink() | 创建符号链接 |
utime() | 更新时间戳 |
tmpfile() | 创建病打开(‘w+b’)一个新的临时文件 |
walk() | 生成一个目录树下的所有文件名 |
目录/文件夹 | |
chdir() | 改变当前工作目录 |
chroot() | 改变当前进程的根目录 |
getcwd() | 返回当前工作目录 |
mkdir()/mkdirs() | 创建目录/多层目录 |
rmdir()/rmdirs() | 删除目录/多层目录 |
访问/权限 | |
access() | 检验权限 |
chmod() | 改变权限 |
chown() | 改变owner |
umask() | 设置默认权限 |
文件描述符操作 | |
open() | 底层的操作系统open |
read()/write() | 读取/写入数据 |
dup()/dup32() | 复制文件描述符/功能相同,但是复制到另一个文件描述符 |
设备号 | |
makedev() | 从major和minor设备号创建一个原始设备号 |
major()/minor() | 从原始设备号获得major/minor设备号 |
函数 | 描述 |
---|---|
分隔 | |
basename() | 去掉目录路径, 返回文件名 |
dirname() | 去掉文件名,返回目录路径 |
join() | 将分离的各部分组成一个路径名 |
split() | 返回(dirname(), basename())元组 |
splitdrive() | 返回(dirvename, pathname)元组 |
splitext() | 返回(filenameextension)元组 |
信息 | |
getatime() | 返回最近访问时间 |
getctime() | 返回文件创建时间 |
getmtime() | 返回文件修改时间 |
getsize() | 返回文件大小 |
查询 | |
exists() | 指定路径是否存在 |
isabs() | 指定路径是否为绝对路径 |
isdir() | 指定路径是否存在且为一个目录 |
isfile() | 指定路径是否存在且为一个文件 |
islink() | 指定路径是否存在且为一个符号链接 |
ismount() | 指定路径是否存在且为一个挂载点 |
samefile() | 两个路径名是否指向同一个文件 |
最后用Python核心编程的一个例子结束本篇博客
#!/usr/bin/env python
import os
for tmpdir in (‘/tmp‘, ‘c:/windows/temp‘):
if os.path.isdir(tmpdir):
break
else:
print ‘no temp directory available‘
tmpdir = ‘‘
if tmpdir:
os.chdir(tmpdir)
cwd = os.getcwd()
print ‘*** current temporary directory‘
print cwd
print ‘*** creating example directory...‘
os.mkdir(‘example‘)
os.chdir(‘example‘)
cwd = os.getcwd()
print ‘*** new working directory:‘
print cwd
print ‘*** original directory listing:‘
print os.listdir(cwd)
print ‘*** creating test file...‘
file = open(‘test‘, ‘w‘)
file.write(‘foo\n‘)
file.write(‘bar\n‘)
file.close()
print ‘*** updated directory listing:‘
print os.listdir(cwd)
print "*** renaming ‘test‘ to ‘filetest.txt‘"
os.rename(‘test‘, ‘filetest.txt‘)
print ‘*** updated directory listing:‘
print os.listdir(cwd)
path = os.path.join(cwd, os.listdir(cwd)[0])
print ‘*** full file pathname:‘
print path
print ‘*** (pathname, basename) == ‘
print os.path.split(path)
print ‘*** (filename, extension) == ‘
print os.path.splitext(os.path.basename(path))
print ‘*** displaying file contents:‘
file = open(path)
allLines = file.readlines()
file.close()
for eachLine in allLines:
print eachLine,
print ‘*** deleting test file‘
os.remove(path)
print ‘*** updated directory listing:‘
print os.listdir(cwd)
os.chdir(os.pardir)
print ‘*** deleting test directory‘
os.rmdir(‘example‘)
print ‘*** DONE‘
输出结果(linux)
likai@likai-Lenovo-G490:~/python$ python ospathex.py
*** current temporary directory
/tmp
*** creating example directory...
*** new working directory:
/tmp/example
*** original directory listing:
[]
*** creating test file...
*** updated directory listing:
[‘test‘]
*** renaming ‘test‘ to ‘filetest.txt‘
*** updated directory listing:
[‘filetest.txt‘]
*** full file pathname:
/tmp/example/filetest.txt
*** (pathname, basename) ==
(‘/tmp/example‘, ‘filetest.txt‘)
*** (filename, extension) ==
(‘filetest‘, ‘.txt‘)
*** displaying file contents:
foo
bar
*** deleting test file
*** updated directory listing:
[]
*** deleting test directory
*** DONE
标签:python
原文地址:http://blog.csdn.net/u012088213/article/details/45816109