python相关笔记

  2019-3-27 


迄今为止在python上遇到的坑,超长预警

  1. with open的使用
    with open('/path/to/file', 'r') as f:
    print(f.read())
    等效于
    try:
        f = open('/path/to/file', 'r')
        print(f.read())
    finally:
        if f:
            f.close()
  2. os.listdir(path) 返回path路径下的所有文件和文件夹列表
  3. os.path.join(path1,str) 将两个字符串合并生成一个新路径
  4. 列表解析功能
    比如b =[i+2 for i in a]
    apk_dirs = [os.path.join(BASE_PATH, name) for name in names]

  5. list用于将元组转换为列表
    元祖不可更改,列表可以更改。列表对应一大批操作函数。

  6. 通过这种方式可以遍历打开Path路径下的所有文件
    注意冒号

    for file in os.listdir(Path):
    with open(os.path.join(Path, file), 'r') as f
    '''熟悉用python操作文件路径 熟悉使用2 3 for in等'''
  7. Python JSON
    http://www.runoob.com/python/python-json.html
    json.dumps 将 Python 对象编码成 JSON 字符串
    json.loads 将已编码的 JSON 字符串解码为 Python 对象

  8. 字典{
    元组(
    列表[

  9. 经常用a.append(1)来代表一位记录特征
  10. shutil.copy(source, destination)
    将source路径的文件复制为destination路径的文件(相当于cp)
  11. matplotlib.pyplot 用于画画的库
  12. dict.value() 方法
    返回所有的字典值组成的列表
  13. index() 函数用于从列表中找出某个值第一个匹配项的索引位置。
  14. jupyter可以方便选择哪几个指定模块来执行 而不用执行整个文件
  15. python目录与文件操作(部分)

    • os.path.exists(path) 判断一个目录是否存在
    • os.makedirs(path) 多层创建目录
    • os.mkdir(path) 创建目录
    • shutil.copy(fileA, fileB) 将路径文件A复制到路径文件B。注意如果fileB路径的中间路径并不存在,需要建立中间的目录!(手动or用os.makedirs)
  16. 混淆矩阵
    sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)
    y_true: 是样本真实分类结果,y_pred: 是样本预测分类结果
    labels:是所给出的类别,通过这个可对类别进行选择
    sample_weight:样本权重
    后两者可以没有
    详细用法见 https://blog.csdn.net/m0_38061927/article/details/77198990

  17. https://blog.csdn.net/m0_37518259/article/details/80658131

  18. 读取文件的编码问题,字符串编码问题 超级大坑
    超级大坑!!!!!
    https://stackoverflow.com/questions/956867/how-to-get-string-objects-instead-of-unicode-from-json

  19. python格式化输出
    print ("Name:%10s Age:%8d Height:%8.2f"%("Aviad",25,1.83))

  20. ```python

    in not in

    正确写法

    key = “aaa”
    lt = [“aaa”,”bbb”,”vvv”]
    if key in lt:

    print("list is true")
    

    else:

    print("list is false")
    

    list is true

    错误写法1:key写成一个列表。 in语法是要一个元素in一个列表

    key = [“aaa”]
    lt = [“aaa”,”bbb”,”vvv”]
    if key in lt:

    print("list is true")
    

    else:

    print("list is false")
    

    list is false

    错误写法2:if a in b is True。 不能用is True。原因不明(?)

    key = “aaa”
    lt = [“aaa”,”bbb”,”vvv”]
    if key in lt is True:

    print("list is true")
    

    else:

    print("list is false")
    

    list is false

    
    21. 有时候python无法判断该数据为数值or字符串。
        所以在输出的时候,有些无法分清的情况需要`print(str(key))`
    
    22. python的函数参数传递(实参和形参)
        在函数体内修改参数内容会影响到函数外的对象吗?
        (1)如果数字、字符串或元组,本身就是不可变的,自然也不会影响到函数体外的对象
        (2)如果是列表或字典,那么函数内修改参数内容,就会影响到函数体外的对象。
        备注:这里的修改参数是修改参数对象内部的值,不是赋值哦。即var[1]='hello'和var=['hello','world']区别。即使是列表,在函数体内对参数重新赋值了,不会影响到函数体外的对象哦。注意和c++的比较。
        相当于python函数参数传递是一个指针
    
    23. 字典添加新pair
        ```python
        dict ={}
        dict['aaa']= 0
  21. python中没有do while循环。可以由如下代码代替

    while True:
    	xxxx
    	if condtion满足:
    		break
  22. 求列表元素个数len(list)

  23. for i in range(a,b) 包含a不包含b

  24. ```
    for line in file:

    line = line.spilt(',‘)
    

    这样读出来的列表元素全是字符串形式!
    而且 末尾的/n也会包含在最后一个字符里

        
    28. `str.strip()`去掉字符串末尾字符(常用来去掉'/n'等
    
    29. `list`有序而`dict`无序
    
    30. 
    	```python
        total_list = sorted(total_dict.items(), key=lambda x: x[1])
        for (key, value) in total_list:

    python中字典是无序的,list是有序的
    想要对字典或列表等排序需要借助sort函数。然而由于字典是无序的,经sort函数操作之后会变成一个列表。如果直接使用sort(dict.values)的话,将生成一个只由字典的value构成的排序后的列表,如果sort(dict.keys)的话同理为只由键组成的排序后的列表。如果要输出键值对的话,就按照上面的代码,转化为了有序元组列表的形式。
    lambda表示语法形式
    lambda x: x[1]x[0]表示对键进行排序,x[1]表示对值进行排序
    sort函数默认是从小到大排序,如果要从大到小则添加参数reverse=True
    【以上内容可继续探索】

  25. python3 中 \即为直接除法

  26. 判断类型是 type(a) is dict
    不是 a is dict

  27. 字典无法在遍历中动态改变,而类别可以

  28. Debug:Error loading notebook An unknown error occurred while loading this notebook.
    这个错误的弥补方法是修改~/.local/share/jupyter文件夹的权限:
    sudo chmod -R 777 ~/.local/share/jupyter

  29. if os.path.splitext(resPath + file)[1] == ‘.jpg’

  30. ls -l filename|grep total
    统计文件夹下文件个数

  31. 递归删除文件夹
    shutil.rmtree(path=folderPath)
    在shutil库下

  32. python多进程默认不能共享全局变量
    https://blog.csdn.net/houyanhua1/article/details/78236514
    python多进程相当于将环境所有变量什么的给每一个进程复制一份,所以你在子进程修改了变量自然不会修改到全局

  33. python子进程不报错 需要用

    try:
    except Exception as ex:
    print(ex)

    来捕获

  34. 重置索引用reset_index然后drop掉index列即可
    reindex就是一坨屎

  35. 截取字符串操作

    str = ‘0123456789’
    print str[0:3] #截取第一位到第三位的字符
    print str[:] #截取字符串的全部字符
    print str[6:] #截取第七个字符到结尾
    print str[:-3] #截取从头开始到倒数第三个字符之前
    print str[2] #截取第三个字符
    print str[-1] #截取倒数第一个字符
    print str[::-1] #创造一个与原字符串顺序相反的字符串
    print str[-3:-1] #截取倒数第三位与倒数第一位之前的字符
    print str[-3:] #截取倒数第三位到结尾
    print str[:-5:-3] #逆序截取,具体啥意思没搞明白?
  36. 位运算

    np.bitwise_and([7],[3])=3
    np.bitwise_or([7],[3])=7
  37. 路径字符串分割

    path.split('/')[-1]
    以/为分隔符,保留倒数第一段
  38. dataFrame.to_csv(savePath,mode='a',header=0,index=False)

  39. python list/字符串替换

    # Python replace() 方法把字符串中的 old(旧字符串/list) 替换成 new(新字符串/list),如果指定第三个参数max,则替换不超过 max 次。
    str = str.replace(old, new[, max])
    # 注意不会改变原始内容,要赋值回去!
  40. python多线程

    # 由于每个python模块(python文件)都包含内置的变量__name__,当运行模块被执行的时候,__name__等于文件名(包含了后缀.py)。如果import到其他模块中,则__name__等于模块名称(不包含后缀.py)。而“__main__”等于当前执行文件的名称(包含了后缀.py)。所以当模块被直接执行时,__name__ == '__main__'结果为真;而当模块被import到其他模块中时,__name__ == '__main__'结果为假,就是不调用对应的方法。
    # __name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。当模块被直接运行时,代码将被运行,当模块是被导入时,代码不被运行
    from multiprocessing import Pool
    
    #创建线程对象
    pool = Pool(processes=k)
    
    #开始执行线程内容 func即为我们每个线程要执行的东西,args为传入func函数参数
    pool.apply_async(func,args=(agr1,arg2,arg3))
    
    #等待所有进程结束
    pool.close()
    pool.join()
  41. 常见迭代方法:

    for index, item in enumerate(list)
  42. os.path.getsize函数的单位为字节B

  43. 正则表达式
    https://blog.csdn.net/u014535666/article/details/82972089#
    注意python3中 .? .+等要用括号包起来! (.?) (.+)
    且注意 findall返回的list元组!
    python正则表达式常用函数的理解:
    https://www.cnblogs.com/papapython/p/7482349.html

  44. df.drop(x) 如果df.drop([等式]) 会出事!直接全没了! 验证一下

  45. linux语句返回输出
    os.system()可以执行linux语句但无法获取输出
    os.popen()就可以获取命令行输出 ,返回的是一个文件
    还要

    r = os.popen(commend)
    result = r.read()
    
  46. python赋值、copy与deepcopy
    list中套list得用deepcopy
    https://blog.csdn.net/u010712012/article/details/79754132
    赋值与深浅拷贝
    https://www.cnblogs.com/Eva-J/p/5534037.html
    python一切都是对象,赋值是传递引用

  47. eval函数在python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型.
    注意 为了安全性 还有个ast.literal_eval
    http://www.php.cn/python-tutorials-376459.html

  48. xgboost版本为0.6a1的时候 对应scikit-learn的版本为0.19.0
    版本要匹配!

  49. 弱智错误:os.system(str)里面只能是一个字符串,如果是要多段拼接是用加号不是逗号!
    os.system("ps","-ef") 错误!
    os.system("ps"+"-ef")正确!

  50. python继承

    #定义类A
    class A:
    
    #B继承A
    class B(A):
    
  51. if __name__ == '__main__':

  52. os.path.join
    用这个组合路径更好!

  53. format函数 (python格式化输出)
    https://www.runoob.com/python/att-string-format.html
    format函数输出可以不限制括号内的参数类型,转化为字符串输出
    format 函数可以接受不限个参数,位置可以不按顺序。

    "{} {}".format("hello", "world")  # 不设置指定位置,按默认顺序
    >>'hello world'
    "{0} {1}".format("hello", "world")  # 设置指定位置
    >>'hello world'
    "{1} {0} {1}".format("hello", "world")  # 设置指定位置
    >>'world hello world'

    也可以设置参数

        print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))
        # 通过字典设置参数  
        site = {"name": "菜鸟教程", "url": "www.runoob.com"} 
        print("网站名:{name}, 地址 {url}".format(**site))
        # 通过列表索引设置参数  
        my_list = ['菜鸟教程', 'www.runoob.com']  
    print("网站名:{0[0]}, 地址 {0[1]}".format(my_list))  # "0" 是必须的
        
        >>网站名:菜鸟教程,  地址 www.runoob.com 
        网站名:菜鸟教程,  地址 www.runoob.com 
        网站名:菜鸟教程,  地址 www.runoob.com

    也可以向 str.format() 传入对象:

        class  AssignValue(object): 
            def  __init__(self, value): 
                self.value = value  
        my_value = AssignValue(6)  
    print('value 为: {0.value}'.format(my_value))  # "0" 是可选的
        
        >>value 为:  6

    数字格式化:

    print("{:.2f}".format(3.1415926));  
    >>3.14

    更多用法列表见网页

  54. 可以这样用

    print('-'*10)
  55. 除法
    / 一般除法
    //整除
    %求余

  56. plt画图
    导库import matplotlib.pyplot as plt
    https://blog.csdn.net/majinlei121/article/details/83994935
    常用函数(用法参数见help)
    plt.plot()画图
    plt.show()显示图像
    plt.legend()显示图像和图例

    plt.xticks()``plt.yticks()x,y坐标轴的值设置(可以设置旋转坐标值等)
    plt.xlabel()``plt.ylabel()x,y轴标签设置
    plt.title()设置图像标题

    w1 = plt.figure() 新建一个画图窗口 w1指向
    ax1 = fig.add_subplot(2,1,1) 向窗口中加入子图,参数为排列位置, ax1指向, 画2行1列个图形的第1个
    ax1.plot() 向ax1中画图

    注意:无论是在子图中画图还是直接画图,都要用plt.show()来显示图像
    在子图中画图,要用 子图窗口.plot()来画图,不用子图则plt.plot()来画图

    plt.scatter()画散点图
    plt.bar()画柱状图

  57. 返回对象的属性值
    vars()
    用法vars(object)
    可用于很多封装对象

  58. zip函数 打包
    网上摘抄理解
    https://www.cnblogs.com/waltsmith/p/8029539.html

    zip函数非常好用!常用

  59. class()(x) 这种用法
    class()即为生成class对象,后面跟个(x)就是调用该生成对象的方法!

  60. getitem()
    如果类中定义了getitem()方法,那么它的实例对象(假设为P)就可以P[Key]这样取值。当实例对象做P[Key]运算的时候就会调用getitem()方法,返回的就是这个方法的return

  61. pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple
    中科大源


且听风吟