本文实例分析了Python字符串和文件操作常用函数。分享给大家供大家参考。具体如下:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
# -*- coding: UTF-8 -*-
'''
Created on 2010-12-27
@author: sumory
'''
import itertools
def a_containsAnyOf_b(seq,aset):
'''判断seq中是否含有aset里的一个或者多个项
seq可以是字符串或者列表
aset应该是字符串或者列表'''
for item in itertools.ifilter(aset.__contains__,seq):
return True
return False
def a_allIn_b(seq,aset):
'''判断seq中的所有项是否都在aset里
seq可以是字符串或者列表
aset应该是字符串或者列表'''
for item in seq:
if item not in aset:
return False
return True
def a_containsAll_b(seq,aset):
'''判断seq是否包含aset里的所有项
seq可以是字符串或者列表
aset应该是字符串或者列表
任何一个set对象a,a.difference(b)等价于a-set(b),即返回a中所有不属于b的元素'''
return not set (aset).difference(seq)
import string
#生成所有字符的可复用的字符串
sumory_allchars = string.maketrans(' ',' ')
def makefilter(keep):
'''返回一个函数,此函数接受一个源字符串作为参数\
并返回字符串的一个部分拷贝\
此拷贝只包括keep中的字符,keep必须是一个普通的字符串\
调用示例:makefilter('abca ')('abcdefgh ijkal cba')\
在后面的字符串中保留前面出现的字符 abc a cba
'''
#按照sumory_allchars规则剔除sumory_allchars字符串中的keep里的字符
#这里得到keep在sumory_allchars的补集
deletechars = sumory_allchars.translate(sumory_allchars,keep)
#生成并返回需要的过滤函数(作为闭包)
def realdelete(sourseStr):
return sourseStr.translate(sumory_allchars,deletechars)
return realdelete
def list_removesame( list ):
'''删除list中的重复项'''
templist = []
for c in list :
if c not in templist:
templist.append(c)
return templist
def re_indent( str ,numberofspace):
'''
缩进\
将字符串str中按换行符划分并在每句前加上numberofspace个space\
再组合成字符串'''
spaces = numberofspace * ' '
lines = [spaces + line.strip() for line in str .splitlines()]
return '\n' .join(lines)
def replace_strby_dict(sourseStr, dict ,marker = '"' ,safe = False ):
'''使用字典替换源字符串中的被marker包裹的相应值'''
#如果safe为True,那么字典中没找到key时不替换
if safe:
def lookup(w):
return dict .get(w,w.join(marker * 2 ))
#w.join(marker*2)用marker包裹w
#如果safe为False,那么字典中没找到key时抛异常\
#若将dict[w]换为dict.get(w)则没找到时返回None
else :
def lookup(w):
return dict [w]
#根据marker切分源字符串
splitparts = sourseStr.split(marker)
#取出切分后的奇数项
#因为切分后,列表中源字符串中marker包裹的项肯定位于基数部位
#就算是'"first"s is one'这样的字符串也是如此
#分割后的第0项为空串,第1项为first
splitparts[ 1 :: 2 ] = map (lookup,splitparts[ 1 :: 2 ])
return ''.join(splitparts)
def simply_replace_strby_dict(sourseStr, dict ,safe = True ):
'''根据dict内容替换sourseStr原串中$标记的子字符串\
dict= {'name':'sumory','else':'default'}
$$5 -> $5
$else -> default
${name}'s method -> sumory's method
'''
style = string.Template(sourseStr)
#如果safe,在dict中找不到的话不会替换,照样保留原串
if safe:
return style.safe_substitute( dict )
#false,找不到会抛异常
else :
return style.substitute( dict )
##################################################
def scanner( object ,linehandler):
'''用linehandler方法遍历object的每一项'''
for line in object :
linehandler(line)
def printfilelines(path):
'''读取path路径下的文件屏逐行打印'''
fileobject = open (path, 'r' ) #open不用放到try里
try :
for line in fileobject:
print (line.rstrip( '\n' ))
finally :
fileobject.close()
def writelisttofile(path,ilist):
fileobject = open (path, 'w' )
try :
fileobject.writelines(ilist)
finally :
fileobject.close()
import zipfile
def listzipfilesinfo(path):
z = zipfile.ZipFile(path, 'r' )
try :
for filename in z.namelist():
bytes = z.read(filename)
print ( 'File:%s Size:%s' % ( unicode (filename, 'cp936' ).decode( 'utf-8' ), len (bytes)))
finally :
z.close()
import os,fnmatch
def list_all_files(root,patterns = '*' ,single_level = False ,yield_folders = False ):
'''列出目录(或者及其子目录下的文件)'''
#分割模式到列表
patterns = patterns.split( ';' )
for path,subdirs,files in os.walk(root):
if yield_folders:
files.extend(subdirs)
files.sort()
for name in files:
for pat in patterns:
if fnmatch.fnmatch(name, pat):
yield '/' .join( unicode (os.path.join(path,name), 'cp936' ).split( '\\' ))
break
if single_level:
break
def swapextensions(root,before,after):
if before[: 1 ]! = '.' :
before = '.' + before
extensionlen = - len (before)
if after[: 1 ]! = '.' :
after = '.' + after
for path,subdirs,files in os.walk(root):
for oldfile in files:
if oldfile[extensionlen:] = = before:
oldfile = os.path.join(path,oldfile)
newfile = oldfile[:extensionlen] + after
os.rename(oldfile, newfile)
|
希望本文所述对大家的Python程序设计有所帮助。