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(方法名,参数)(方法所属对象)

猜你喜欢

转载自www.cnblogs.com/burningcarbon/p/12432581.html