os模块
在python编程中,我们会经常使用到文件和目录,这些操作python提供一个os模块,里面有很多操作文件和目录的函数.
下面介绍os的常用功能
1.获取当前路径
?
1
2
>>> os.getcwd()
'/root/python'
2.获取目录中的内容
?
1
2
>>> os.listdir(os.getcwd())
['deco.py','6.py','inputfile.py','uniFile.py','oddnogen.py','ospathex.py','operate.py','bianliang.py','typecheck1.py']
3.创建目录
?
1
>>> os.mkdir('/root/pythontest')
一次性创建嵌套目录可使用os.makedirs,makedirs可以生成多层递归目录,removedirs可以删除多层递归的空目录,若目录中有文件则无法删除;os.system():运行shell命令;
?
1
2
3
4
5
6
7
8
9
10
11
>>> os.environ['HOME']
'/root'
>>> os.makedirs(os.path.join(os.environ['HOME'],'test','py'))
>>> os.system('ls -lR /root/test')
/root/test:
total4
drwxr-xr-x2 root root4096 2013-03-29 17:27 py
/root/test/py:
total0
0
4.改变工作目录
?
1
2
3
4
5
>>> os.getcwd()
'/root/python'
>>> os.chdir('/etc')
>>> os.getcwd()
'/etc'
5.删除目录
?
1
2
>>> os.rmdir('/root/pythontest')
>>>
注:删除目录必须是空目录
6.删除文件
?
1
>>> os.remove('/root/pytest.py')
7.重命名文件或者目录
?
1
>>> os.rename('/root/pytest.py','/root/test.py')
8.字符串给出当前平台使用的终止符,例如:Windows使用'\r\n',Linux使用'\n'
?
1
2
>>> os.linesep
'\n'
以下是os.path模块
9.判断是否是目录
?
1
2
>>> os.path.isdir('/root/python')
True
10.判断是否为文件
?
1
2
>>> os.path.isfile('/root/python')
False
11.返回一个路径的目录名和文件名
?
1
2
>>> os.path.split(os.getcwd())
('/root','python')
12.判断是否存在文件或目录name
?
1
2
3
4
>>> os.path.exists('/root')
True
>>> os.path.exists('/root/1.py')
False
13.获得文件大小
?
1
2
>>> os.path.getsize('/root/python/if.py')
282
14.返回文件路径,返回文件名
?
1
2
3
4
>>> os.path.dirname('/root/python/if.py')
'/root/python'
>>> os.path.basename('/root/python/if.py')
'if.py'
15.连接目录与文件名或目录
?
1
2
>>> os.path.join('/dave/test/','1.py')
'/dave/test/1.py'
判断一个目录里哪些是文件哪些是目录.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
>>>for file in os.listdir('/root/python'):
...if os.path.isdir(file):
...print file,"is a directory"
...else:
...print file,"is a file"
...
deco.pyis afile
inputfile.pyis afile
operate.pyis afile
hello.pycis afile
userpw.pyis afile
4.py is afile
answeris a directory
fileinput模块
fileinput模块可以遍历文本文件的所有行.它的工作方式和readlines很类似,不同点在于,它不是将全部的行读到列表中而是创建了一个xreadlines对象.
下面是fileinput模块中的常用函数
input() #它会返回能够用于for循环遍历的对象.
filename() #返回当前文件的名称
lineno() #返回当前(累计)的行数
filelineno() #返回当前文件的行数
isfirstline() #检查当前行是否是文件的第一行
close() #关闭序列
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
>>>import fileinput
>>>for eachlinein fileinput.input("/root/datafile.txt"):
...print eachline
...
Dave
python
>>>for eachlinein fileinput.input("/root/datafile.txt"):
...print fileinput.filename()
...
/root/datafile.txt
/root/datafile.txt
>>>for eachlinein fileinput.input("/root/datafile.txt"):
...print fileinput.lineno(),eachline
...
1 Dave
2 python
>>>for eachlinein fileinput.input("/root/datafile.txt"):
...if fileinput.isfirstline():
...print eachline
...else:
...break
...
Dave
下面是一个关于日志分析的小实例,将日志中截取匹配的电话号码,如800-333-1212
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
root@10.1.1.45:~# cat telphone.log
027-987-1212
02187899682
021-110-9632
root@10.1.1.45:~# cat fileinputtest.py
#!/usr/bin/python2.5
import fileinput
import sys
import re
pattern= "\d{3}-\d{3}-\d{4}"
filePath= "/root/telphone.log"
for eachlinein fileinput.input(filePath):
a= re.search(pattern,eachline)
if a:
# sys.stdout.write("============\n")
# sys.stdout.write(eachline)
print "============"
print 'line:',fileinput.lineno(),'filename:',fileinput.filename(),'length:',len(eachline.strip('\n')),eachline
root@10.1.1.45:~# ./fileinputtest.py
============
line:1 filename:/root/telphone.log length:12 027-987-1212
============
line:3 filename:/root/telphone.log length:12 021-110-9632