《python标准库》学习笔记2

1.处理文件

内建的open/file函数用于创建,打开和编辑文件,而os模块提供了重命名和删除文件所需的函数

import os
def replace(file,search_for,replace_with):
    back = os.path.splitext(file)[0]+'.bak'
    print(back)
    temp = os.path.splitext(file)[0]+'.tmp'
    fi = open(file)
    fo = open(temp,'w')
    try:
        os.remove(temp)
    except os.error:
        pass
    
    for s in fi.readlines():
        fo.write(str.replace(s, search_for,replace_with))
    fi.close()
    fo.close()
    
    try:
        os.remove(back)
    except os.error:
        pass
    os.rename(file, back)
    os.rename(temp,file)
file = 'g:/csy.txt'
replace(file,'hello','tjena')  
replace(file,'tjena','hello')  

2. 处理目录

os模块也包含一些用于目录处理的函数,listdir函数返回给定目录中所有文件名(包括目录名)组成的列表

import os 
for file in os.listdir('g:/my_paper'):
	print(file)

getcwd和chdir函数分别用于获得和改变当前工作目录

import os 
cwd = os.getcwd()
print('1',cwd)
os.chdir('g:\\my_paper')
print('2',os.getcwd())
os.chdir(os.pardir)
print('3',os.getcwd())

结果:

1 D:\Workspaces\MyEclipse 10\python1.0\src\Mysource\Module

2 g:\my_paper

3 g:\

makedirsremovedirs函数用于创建或删除目录层

import os 
os.makedirs('g:\\test\\multiple\\levels')
fp = open('g:\\test\\multiple\\levels\\file.txt','w')
fp.write('inspector praline')
fp.close()
os.remove('e:\\test\\multiple\\levels\\file.txt')
os.removedirs('e:\\test\\multiple\\levels')

removedirs函数会删除所给路径中最后一个目录下所有的空目录,而mkdir和rmdir函数只能处理单个目录级

3. 处理文件属性

Stat函数可以用来获取一个存在文件的信息,它返回一个类元组对象(stat_result对象,包括10个元素),依次是st_mode(权限模式),st_ino(inode number),st_dev(device),st_nlink(number of hard links),st_uid(所有者用户ID),st_gid(所有者所在组ID),st_size(文件大小,字节),st_atime(最近一次访问时间),st_mtime(最近修改时间),st_ctime(平台相关,Unix下的最近一次元数据/metadata修改时间,或者windows下的创建时间)

import os
import time
file = 'g:\\my_paper\\paper.wps'
def dump(st):
    mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime=st
    print('-size:',size,'bytes')
    print('-owner:',uid,gid)
    print('-created:',time.ctime(ctime))
    print('-last accessed:',time.ctime(atime))
    print('-last modified:',time.ctime(mtime))
    print('-mode:',oct(mode))
    print('-inode/dev:',ino,dev)

st = os.stat(file)
print('stat',file)
dump(st)

fp = open(file)
st = os.fstat(fp.fileno())
print('fstat',file)
dump(st)

stat模块包含了很多可以处理该返回对象的常量及函数,下面代码展示了其中的一些,可以使用chmodutime函数修改文件的权限模式和时间属性。

import time,stat,os
infile = 'g:\\samples\\sample.txt'
outfile = 'g:\\sample.txt'
fi = open(infile,'rb')
fo = open(outfile,'wb')

while 1:
    s = fi.read(10000)
    if not s:
        break
    fo.write(s)
fi.close()
fo.close()
st = os.stat(infile)
os.chmod(outfile, stat.S_IMODE(st[stat.ST_MODE]))
os.utime(outfile, (st[stat.ST_ATIME], st[stat.ST_MTIME]))
print('original','=>')
print('mode',oct(stat.S_IMODE(st[stat.ST_MODE])))
print('atime',time.ctime(st[stat.ST_ATIME]))
print('mtime',time.ctime(st[stat.ST_MTIME]))
print('copy','=>')
st = os.stat(outfile)
print('mode',oct(stat.S_IMODE(st[stat.ST_MODE])))
print('atime',time.ctime(st[stat.ST_ATIME]))
print('mtime',time.ctime(st[stat.ST_MTIME]))

结果:

original =>

mode 0o666

atime Mon Dec 17 10:18:29 2012

mtime Mon Dec 17 10:18:41 2012

copy =>

mode 0o666

atime Mon Dec 17 10:18:29 2012

mtime Mon Dec 17 10:18:41 2012

4. 处理进程

system 函数在当前进程下执行一个新命令,并等待它完成

import os 
if os.name == 'nt':
    command = 'dir'
else:
    command = 'ls -l'

os.system(command)

处理进程还有好多命令在这里就不一一列举。

5. os.path模块

5.1处理文件名

Os.path模块包含了许多与平台无关的处理长文件名的函数,也就是说你不需要处理前后斜杠,冒号等

import os
filename = 'my/little/pony'
print('using',os.name,'...')
print('split','=>',os.path.split(filename))
print('splitext','=>',os.path.splitext(filename))
print('dirname','=>',os.path.dirname(filename))
print('basename','=>',os.path.basename(filename))
print('join','=>',os.path.join(os.path.dirname(filename),os.path.basename(filename)))

结果:

using nt ...

split => ('my/little', 'pony')

splitext => ('my/little/pony', '')

dirname => my/little

basename => pony

join => my/little\pony

6. stat模块

import stat,os,time
st = os.stat('g:\\samples/sample.txt')
print('mode','=>',oct(stat.S_IMODE(st[stat.ST_MODE])))
print('type','=>')
if stat.S_ISDIR(st[stat.ST_MODE]):
    print('DIRECTORY')
if stat.S_ISREG(st[stat.ST_MODE]):
    print('REGULAR')
if stat.S_ISLNK(st[stat.ST_MODE]):
    print('LINK')
print('size','=>',st[stat.ST_SIZE])
print('last accessed','=>',time.ctime(st[stat.ST_ATIME]))
print('last modified','=>',time.ctime(st[stat.ST_MTIME]))
print('inode changed','=>',time.ctime(st[stat.ST_CTIME]))

结果:

mode => 0o666

type =>

REGULAR

size => 0

last accessed => Mon Dec 17 10:51:24 2012

last modified => Mon Dec 17 10:51:24 2012

inode changed => Mon Dec 17 10:51:24 2012

7. string模块

text = "Monty Python's Flying Circus"
print('upper','=>',text.upper())
print('lower','=>',text.lower())
print('split','=>',text.split())
print('join','=>',text.join(text.split()))
print('replace','=>',text.replace('python','java'))
print('find','=>',text.find('python'),text.find('java'))
print('count','=>',text.count('n'))

结果:

upper => MONTY PYTHON'S FLYING CIRCUS

lower => monty python's flying circus

split => ['Monty', "Python's", 'Flying', 'Circus']

join => MontyMonty Python's Flying CircusPython'sMonty Python's Flying CircusFlyingMonty Python's Flying CircusCircus

replace => Monty Python's Flying Circus

find => -1 -1

count => 3

8. copy模块

copy模块包含两个函数,用来拷贝对象,copy(object) => object创建给定对象的浅/浅层(shallow)拷贝,这里的浅/浅层(shallow)拷贝的意思是复制对象本身,但当对象时一个容器时,它的成员任然指向原来的成员对象。

import copy
a = [[1],[2],[3]]
b = copy.copy(a)
print('before','=>',a,b)

a[0][0] = 0
a[1] = None
print('after','=>',a,b)

结果:

before => [[1], [2], [3]] [[1], [2], [3]]

after => [[0], None, [3]] [[0], [2], [3]]

其实也可以使用[:]语句来对列表进行浅层复制,相反了deepcopy(object) => object创建一个对象的深层拷贝,当对象是一个容器时,所有的成员都被递归的复制了。

import copy
a = [[1],[2],[3]]
b = copy.deepcopy(a)
print('before','=>',a,b)

a[0][0] = 0
a[1] = None
print('after','=>',a,b)

结果:

before => [[1], [2], [3]] [[1], [2], [3]]

after => [[0], None, [3]] [[1], [2], [3]]

9. sys模块

9.1 解释器启动后,argv解表包含了传递给脚本的所有参数,列表的第一个元素为脚本自身的名称。

import sys
print('script name is',sys.argv[0])
if len(sys.argv)>1:
    print('there are',len(sys.argv)-1,'arguments:')
    for arg in sys.argv[1:]:
        print(arg)
else:
	print('there are no arguments!')

结果:

script name is D:\Workspaces\MyEclipse 10\python1.0\src\Mysource\Module\Test.py

there are no arguments!

9.2 stdin,stdout以及stderr

import sys
class Redirect:
    def __init__(self,stdout):
        self.stdout = stdout
    def write(self,s):
        self.stdout.write(s.lower())
old_stdout = sys.stdout
sys.stdout = Redirect(sys.stdout)
print('HEJA SVERIGE')
print('FRISKT HUM')

sys.stdout = old_stdout
print('MLASJDL;JG;')

结果:

heja sverige

friskt hum

MLASJDL;JG;

要重定向输出只要创建一个对象,并实现它的write方法。















 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值