python实用技巧总结(二)
十三、去掉字符串中特定的字符
方法一:字符串strip(),rstrip(),lstrip()去掉两端或某一端字符
方法二:字符串切片加拼接
方法三:字符串的replace()方法或正则表达式re.sub()删除任意子串
方法四:字符串的translate()方法,可以同时删除多种不同字符
十四、python文本文件操作
文件打开:文件对象名=open(name[, mode[, buffering]])
name : 一个包含了你要访问的文件名称的字符串值。
mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
buffering :
如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。
如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大 小。如果取负值,寄存区的缓冲大小则为系统默认。
文件关闭:文件对象名.close()
flush和close的区别
flush():将缓冲区的数据刷到目的地中后,流可以使用。
close():将缓冲区的数据刷到目的地中后,流就关闭了,该方法主要用于结束调用的底层资源。这个动作一定做。
十五、设置文件缓冲
全缓冲:open函数的buffering设置为大于1的整数,该数为缓冲区大小
行缓冲:open函数的buffering设置为1(文本模式下才可以)
无缓冲:open函数的buffering设置为0
十六、将文件映射到内存
目的:
1.把文件映射到内存中实现对二进制文件的随机访问
2.某些嵌入式设备的寄存器被编址到内存地址空间,可以通过映射去访问这些寄存器
3.多个进程映射到同一个文件以实现进程通信的目的
解决方案
使用标准库的mmap.mmap()函数,将文件映射到进程的内存地址空间
m=mmap.mmap(fileno, length[, flags[, prot[, access[, offset]]]])
fileno:文件编码,可通过文件对象.fileno()得到
length:文件描述符,可以是file对象的fileno()方法,或者来自os.open()
要映射文件部分的大小(以字节为单位),这个值为0,则映射整个文件,如果大小大于文件当前大小,则扩展这个文件。
flags:
MAP_PRIVATE:这段内存映射只有本进程可用;
mmap.MAP_SHARED:将内存映射和其他进程共享,所有映射了同一文件的进程,都能够看到其中一个所做的更改;
prot:mmap.PROT_READ, mmap.PROT_WRITE 和 mmap.PROT_WRITE | mmap.PROT_READ。最后一者的含义是同时可读可写。
access:在mmap中有可选参数access的值有
ACCESS_READ:读访问。
ACCESS_WRITE:写访问,默认。
ACCESS_COPY:拷贝访问,不会把更改写入到文件,使用flush把更改写到文件。
十七、使用临时文件
临时文件不用命名,关闭后会被自动删除,在文件系统中访问不到
解决方案标准库tempfile.TemporaryFile(匿名),NamedRemporaryFile(命名)二者的区别:
与TemporaryFile不同的是,NamedTemporaryFile 会生成真的文件
TemporaryFile 不在硬盘上的生成真正文件,而是写在内存中
示例
from tempfile import TemporaryFile , NamedTemporaryFile
# 1. 读取
f = TemporaryFile(mode="w+")
# 参数:
# 1). mode="w+" 允许 打开的模式, 默认 为 w+b 模式
# w 写模式
# w+ 读写模式
# w+b 读写 Bytes 模式
# 2). buffering=-1 缓冲区大小, -1 是不限制
# 3). encoding=None 读取的文件的字符编码
f.write("abcdefg\nhijkmlm\nopqist\nuvwxyz") # 写入
f.seek(0) # 将 光标 切换到开始
# line = f.readlines() # 按照 每一行进行读取
line = f.read() # 读取全部
print(line)
#有一个参数delete=True 时,变量被清除时,生成的文件就会被删除,delete=False 时,文件不会被删除
from tempfile import NamedTemporaryFile
# 1. 读取
f = NamedTemporaryFile(mode="w+", dir=r"D:\data\01_RPA_Project")
# 参数:
# 1). mode="w+" 允许 打开的模式, 默认 为 w+b 模式
# w 写模式
# w+ 读写模式
# w+b 读写 Bytes 模式
# 2). buffering=-1 缓冲区大小, -1 是不限制
# 3). encoding=None 读取的文件的字符编码
# 4). dir=None 临时文件存放的文件的位置
# 5). delete=True 变量删除后 将文件删除, delete=False 时,变量删除时不会删除
print(f.name) # 打印文件名
f.write("abcdefg\nhijkmlm\nopqist\nuvwxyz") # 写入
f.seek(0) # 将 光标 切换到开始
# line = f.readlines() # 按照 每一行进行读取
line = f.read() # 读取全部
print(line)
十八、实例属性做类型检查
目的:希望像静态类型语言那样,对他们的实例属性做类型检查
方案:使用描述符
十九、常用装饰器
@property
使调用类中的方法像引用类中的字段属性一样。被修饰的特性方法,内部可以实现处理逻辑,但对外提供统一的调用方式。遵循了统一访问的原则。
此外,@property可以用来实现类似与Java中set和get方法
@staticmethod
将类中的方法装饰为静态方法,即类不需要创建实例的情况下,可以通过类名直接引用。到达将函数功能与实例解绑的效果。
@classmethod
类方法的第一个参数是一个类,是将类本身作为操作的方法。类方法被哪个类调用,就传入哪个类作为第一个参数进行操作。
二十、如何将变量转变为同名字符串
解决方案:
字典化然后提取key名
此方法无法抽象成函数
示例
>> abc = 376
# 第一步:字典化
>> dict(abc = abc)# 最骚的就是这步了
>> {'abc': 376} # 所得的字典
#第二步:取字典的key
>> dict(abc = abc).keys()
>> dict_keys(['abc'])# 得到一个字典key版的字符串
# 第三步:list化
>> list(dict(abc = abc).keys())
>> ['abc']# 得到一个list
# 最后
>> list(dict(abc = abc).keys())[0]
>> 'abc' # 你要的东西:变量名的字符串
二十一、环状数据结构中管理内存
问题:例如循环链表、图等环状数据结构中存在变量之间的相互引用或者循环引用,在不需要的时候不会被自动回收,造成内存的大量占用
解决方案:使用弱引用weakref模块,弱引用也能引用对象,但不会增加引用计数,当变量之间全部都是弱引用时,会被系统自动回收
二十二、通过实例方法名字字符串调用方法
方案一:调用getattr(对象,属性名)(参数)
方案二:operator模块的methodcaller(方法名,参数)(方法所属对象)