os模块
在python编程中,我们会经常使用到文件和目录,这些操作python提供一个os模块,里面有很多操作文件和目录的函数.

下面介绍os的常用功能

1.获取当前路径

>>> os.getcwd()
\'/root/python\'

2.获取目录中的内容

>>> os.listdir(os.getcwd())
[\'deco.py\', \'6.py\', \'inputfile.py\', \'uniFile.py\', \'oddnogen.py\', \'ospathex.py\', \'operate.py\', \'bianliang.py\', \'typecheck1.py\']

3.创建目录

>>> os.mkdir(\'/root/pythontest\')

   一次性创建嵌套目录可使用os.makedirs,makedirs可以生成多层递归目录,removedirs可以删除多层递归的空目录,若目录中有文件则无法删除;os.system():运行shell命令;

>>> os.environ[\'HOME\']
\'/root\'
>>> os.makedirs(os.path.join(os.environ[\'HOME\'],\'test\',\'py\'))
>>> os.system(\'ls -lR /root/test\')
/root/test:
total 4
drwxr-xr-x 2 root root 4096 2013-03-29 17:27 py
 
/root/test/py:
total 0
0

4.改变工作目录

>>> os.getcwd()
\'/root/python\'
>>> os.chdir(\'/etc\')
>>> os.getcwd()
\'/etc\'

5.删除目录

>>> os.rmdir(\'/root/pythontest\')
>>>

注:删除目录必须是空目录

6.删除文件

>>> os.remove(\'/root/pytest.py\')

7.重命名文件或者目录

>>> os.rename(\'/root/pytest.py\',\'/root/test.py\')

8.字符串给出当前平台使用的终止符,例如:Windows使用\’\\r\\n\’,Linux使用\’\\n\’

>>> os.linesep
\'\\n\'

以下是os.path模块

9.判断是否是目录

>>> os.path.isdir(\'/root/python\')
True

10.判断是否为文件

>>> os.path.isfile(\'/root/python\')
False

11.返回一个路径的目录名和文件名

>>> os.path.split(os.getcwd())
(\'/root\', \'python\')

12.判断是否存在文件或目录name

>>> os.path.exists(\'/root\')
True
>>> os.path.exists(\'/root/1.py\')
False

13.获得文件大小

>>> os.path.getsize(\'/root/python/if.py\')
282

14.返回文件路径,返回文件名

>>> os.path.dirname(\'/root/python/if.py\')
\'/root/python\'
>>> os.path.basename(\'/root/python/if.py\')
\'if.py\'

15.连接目录与文件名或目录

>>> os.path.join(\'/dave/test/\',\'1.py\')
\'/dave/test/1.py\'

判断一个目录里哪些是文件哪些是目录.

>>> for file in os.listdir(\'/root/python\'):
...   if os.path.isdir(file):
...     print file,\"is a directory\"
...   else:
...     print file,\"is a file\"
... 
deco.py is a file
inputfile.py is a file
operate.py is a file
hello.pyc is a file
userpw.py is a file
4.py is a file
answer is a directory

fileinput模块
fileinput模块可以遍历文本文件的所有行.它的工作方式和readlines很类似,不同点在于,它不是将全部的行读到列表中而是创建了一个xreadlines对象.

下面是fileinput模块中的常用函数

  • input() #它会返回能够用于for循环遍历的对象.
  • filename() #返回当前文件的名称
  • lineno() #返回当前(累计)的行数
  • filelineno() #返回当前文件的行数
  • isfirstline() #检查当前行是否是文件的第一行
  • close() #关闭序列
>>> import fileinput
>>> for eachline in fileinput.input(\"/root/datafile.txt\"):
...   print eachline
... 
Dave
 
python
 
>>> for eachline in fileinput.input(\"/root/datafile.txt\"):
...   print fileinput.filename()
... 
/root/datafile.txt
/root/datafile.txt
>>> for eachline in fileinput.input(\"/root/datafile.txt\"):
...   print fileinput.lineno(),eachline
... 
1 Dave
 
2 python
 
>>> for eachline in fileinput.input(\"/root/datafile.txt\"):
...   if fileinput.isfirstline():
...     print eachline
...   else:
...     break
... 
Dave

下面是一个关于日志分析的小实例,将日志中截取匹配的电话号码,如800-333-1212

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 eachline in 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