Home  >  Article  >  Backend Development  >  Python文件和目录操作详解

Python文件和目录操作详解

WBOY
WBOYOriginal
2016-06-10 15:17:57981browse

一、文件的打开和创建

1、打开

复制代码 代码如下:

open(file,mode):

>>>fo = open('test.txt', 'r')
>>>fo.read()
'hello\n'
>>>fo.close()
file(file,mode):

>>>f = file('test.txt', 'r')
>>>f.read()
'hello\n'
>>>f.close()


mode可取值:

2、创建

用w/w+/a/a+模式打开即可。

二、文件的读取
1、String = FileObject.read([size])

复制代码 代码如下:

>>> fr = open('test.txt')
>>> fr.read()
'hello\nworld\n'

or:
复制代码 代码如下:

>>> for i in open('test.txt'):
...     print i
...
hello

world


2、String = FileObject.readline([size])
复制代码 代码如下:

>>> f = open('test.txt')
>>> f.readline()
'hello\n'
>>> f.readline()
'world\n'
>>> f.readline()
''

或者可以用next

3、List = FileObject.readlines([size])

复制代码 代码如下:

>>> f = open('test.txt')
>>> f.readlines()
['hello\n', 'world\n']

三、文件的写入

1、write(string)

复制代码 代码如下:

>>> f = open('test.txt', 'a')
>>> f.write('hello\nworld')

#'hello\nworld'

2、writelines(list)

复制代码 代码如下:

>>> l = ['a','b','c']
>>> f=open('test.txt','a')
>>> f.writelines(l)

#'hello\nworldabc'


注:writelines相当于调用了多次write,不会自动添加换行(\n)符

四、内容查找替换

1、FileObject.seek(offset, mode)

offset:偏移量

mode:
0表示将文件指针指向从文件头部到“偏移量”字节处,
1表示将文件指针指向从文件当前位置向后移动“偏移量”字节,
2表示将文件指针指向从文件尾部向前移动“偏移量”字节。

复制代码 代码如下:

>>> f=open('test.txt')
>>> f.read()
'hello\nworldabc'
>>> f.read()
''
>>> f.seek(0,0)
>>> f.read()
'hello\nworldabc'
>>> f.close()

2、flush:提交更新,即在文件关闭之前把内存中的内容强制写入文件(一般是文件关闭后写入)

3、文件查找:遍历行进行查找

复制代码 代码如下:

#!/usr/bin/python
import re

search='hello world'
file='test.txt'
count = 0
f = open(file)
for l in f.readlines():
    li = re.findall(search,l)
    if len(li) > 0:
        count += len(li)
print "Search " + str(count) + " \"" + search + "\""
f.close()

4、文件内容替换:遍历行进行替换

替换到新文件demo:

复制代码 代码如下:

#!/usr/bin/python

os='hello'
of='test.txt'

rs='ten'
rf='test2.txt'

ofh = open(of)
newl=[]
for l in ofh.readlines():
    nl = l.replace(os,rs)
    newl.append(nl)

rfh = open(rf,'w+')
rfh.writelines(newl)
ofh.close()
rfh.close()


替换到原文件demo:
复制代码 代码如下:

[server@localserver file]$ cat test.txt
abc
hello
world
hello world
helloworld
hello hello world
[server@localserver file]$ cat fr.py
#!/usr/bin/python

os='hello'
file='test.txt'

rs='ten'

f = open(file, 'r+')
s=f.read()
f.seek(0,0)
f.close()
f = open(file, 'w+')
f.write(s.replace(os,rs))
f.close()
[server@localserver file] python fr.py
[server@localserver file]$ cat test.txt
abc
ten
world
ten world
tenworld
ten ten world

这里采用了重建文件的办法。

或用 fileinput 模块直接在原文件上修改:

复制代码 代码如下:

#!/usr/bin/python
import fileinput

os='hello'
file='test.txt'

rs='ten'

for line in fileinput.input(file, inplace=True):
    print line.replace(os,rs).replace('\n','')


注意,这里删除了\n是因为print时会写入换行。

五、文件及目录操作

一般是借助OS模块实现

1、mkdir(path[,mode=0777]):创建目录,相当于mkdir

复制代码 代码如下:

>>>import os
>>>os.mkdir('tt')

2、makedirs(name[, mode=511]):创建多级目录,相当于mkdir -p

3、rmdir(path):删除目录,相当于rm

4、removedirs(path):删除多级目录,相当于rm -rf

5、listdir(path):列出目录中文件和文件夹,相当于ls

6、getcwd():获取当前路径,相当于pwd

7、chdir(path):切换目录,相当于cd

8、rename(src, dst):重命名

9、shutil.copyfile(str,dst):复制文件(要引入shutil模块)

10、path.splitext(filename):获取文件路径和扩展名

复制代码 代码如下:

>>> import os
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.ext')
>>> fileName
'/path/to/somefile'
>>> fileExtension
'.ext'

11、walk(top, topdown=True, onerror=None):遍历目录

复制代码 代码如下:

>>> import os
>>> g = os.walk('a')
>>> g.next()
('a', ['b'], [])
>>> g.next()
('a/b', ['f', 'c'], [])
>>> g.next()
('a/b/f', [], ['3.txt'])
>>> g.next()
('a/b/c', ['d', 'e'], [])
>>> g.next()
('a/b/c/d', [], ['1.txt'])
>>> g.next()
('a/b/c/e', [], ['2.txt'])

walk返回的是一个生成器,生成器中的内容是:当前目录,目录列表,文件列表

python自己递归实现文件遍历:

复制代码 代码如下:

#!/usr/bin/python
import os

def dirList(path):
    filelist = os.listdir(path)
    fpath = os.getcwd()
    allfile = []
    for filename in filelist:
        filepath = os.path.abspath(os.path.join(path, filename))
        if os.path.isdir(filepath):
            allfile.extend(dirList(filepath))
        else:
            allfile.append(filepath)
    return allfile

files = dirList('a')
print files

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn