• 【python零基础入门学习】python基础篇之文件对象open、模块以及函数的使用(三)


     本站以分享各种运维经验和运维所需要的技能为主

    《python》:python零基础入门学习

    shell》:shell学习

    《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战

    《k8》暂未更新

    docker学习》暂未更新

    《ceph学习》ceph日常问题解决分享

    《日志收集》ELK+各种中间件

    《运维日常》持续更新中

    文件对象

    操作步骤: 打开 ,  读写 , 关闭

    open内建函数:

    访问模式:

    1. # cp /etc/passwd /tmp/
    2. >>> f = open('/tmp/password')  -----默认r模式,文件不存在则报错
    3. Traceback (most recent call last):
    4.   File "", line 1, in <module>
    5. FileNotFoundError: [Errno 2] No such file or directory: '/tmp/password'
    6. >>> f = open('/tmp/passwd')
    7. >>> data = f.
    8. f.buffer          f.encoding        f.isatty(         f.newlines        f.readlines(      f.truncate(
    9. f.close(          f.errors          f.line_buffering  f.read(           f.seek(           f.writable(
    10. f.closed          f.fileno(         f.mode            f.readable(       f.seekable(       f.write(
    11. f.detach(         f.flush(          f.name            f.readline(       f.tell(           f.writelines(
    12. >>> data = f.read()
    13. >>> data
    14. >>> data = f.read() 文件指针已到结尾,再读取将为空串-----指针没有回头草
    15. >>> data
    16. ''
    17. >>> f.close()
    18. >>> f = open('/tmp/passwd')
    19. >>> data = f.read()
    20. >>> data
    21. >>> f.read(4)---读取4字节
    22. 'root'
    23. >>> f.read(6)---继续往后读6字节
    24. ':x:0:0'
    25. >>> f.readline()读到换行符\n结束 ----类型是 str  字符类型
    26. >>> f.readlines()--# 把每一行数据读出来放到列表中
    27. ':root:/root:/bin/bash\n'
    28. >>> data = f.readlines()
    29. >>> type(data)
    30. <class 'list'>
    31. >>> data
    32. ###############最常用的读取文件的方法#################
    33. f = open('/tmp/passwd')
    34. for line in f:
    35.     print(line, end='')
    36. f.close()
    37. ##############################
    38. f = open('图片地址', 'rb')  # 打开非文本文件要加参数b
    39. f.read(4096)
    40. f.close()
    41. [root@room9pc01 ~]# eog me1.png
    42. 打开图片
    43. *************文本也可以用rb的方式打开*******
    44. #一个英文字符正好占一个字节,就用英文字符本身去显示
    45. 但是一个汉子再utf9编码中占3字节,没有办法把一个字节表示成字符,所以就用16进制数表示
    46. # cat /tmp/a.txt
    47. hello一月份
    48. >>> f = open('/tmp/a.txt','rb')
    49. >>> f.read()
    50. b'hello\xe4\xb8\x80\xe6\x9c\x88\xe4\xbb\xbd\n'
    51. >>> s1 = b'\xe4\xb8\x80'
    52. >>> s1
    53. b'\xe4\xb8\x80'
    54. >>> s1.decode()
    55. '一'
    56. f.close()
    57. >>> s2 = '月'
    58. >>> s2.encode()
    59. b'\xe6\x9c\x88'
    60. *******************************************
    61. ##################################
    62. f = open('/tmp/myfile', 'w')  # 'w'打开文件,如果文件不存在则创建
    63. f.write('hello world!\n')
    64. f.flush()  # 立即将缓存中的数据同步到磁盘
    65. f.writelines(['2nd line.\n', 'new line.\n'])
    66. f.close()  # 关闭文件的时候,数据保存到磁盘
    67. ##############################
    68. with语句结束时,自动关闭文件
    69. with open('/tmp/passwd') as f:
    70.     print(f.readline())
    71. #########################
    72. 移动指针的位置以及查看指针的位置
    73. --f = open('/tmp/passwd', 'rb') ---一定要rb
    74. f = open('/tmp/passwd')
    75. f.tell()  # 查看文件指针的位置
    76. f.readline()
    77. f.tell()
    78. f.seek(0, 0)  # 第一个数字是偏移量,第2位是数字是相对位置。
    79.               # 相对位置0表示开头,1表示当前,2表示结尾
    80. f.seek(-5,2)   #左为负   右为正
    81. f.tell()
    82. f.close()

    拷贝文件:

    1. # f1 = open('/bin/ls', 'rb')
    2. # f2 = open('/tmp/list', 'wb')
    3. #
    4. # data = f1.read()
    5. # f2.write(data)
    6. #
    7. # f1.close()
    8. # f2.close()
    9. [root@room9pc01 tmp]# md5sum /bin/ls /tmp/list
    10. a78c13d806e594dc4014d145d689f23/bin/ls
    11. a78c13d806e594dc4014d145d689f23/tmp/list
    12. src_fname = '/bin/ls'
    13. dst_fname = '/tmp/list2'
    14. src_fobj = open(src_fname, 'rb')
    15. dst_fboj = open(dst_fname, 'wb')
    16. #就像商品供货的例子
    17. while 1:
    18.     data = src_fobj.read(4096)
    19.     if data == b'':
    20. #if len(data) == 0:
    21. #if not data : 空串(b'')为假,取反为真
    22.         break
    23.     else:
    24.         dst_fboj.write(data)
    25. src_fobj.close()
    26. dst_fboj.close()

    函数:

    1. 使用def定义

    2. 调用函数务必使用()

    3. 函数一般都需要有一个返回值

    • 返回值使用return关键字指定

    • 没有return默认返回None

    1. >>> def add():
    2. ...     result = 10 + 20
    3. ...
    4. >>> a = add()
    5. >>> print(a)
    6. None
    7. ------通过上面的例子可以知道,需要return返回值,不然只会默认输出None----
    8. ###########函数############
    9. def mk_fib():
    10.     fib = [0,1#函数内部的变量是局部变量,只能在函数内使用
    11.     n = int(input('长度: '))
    12.     for i in range(n - 2):
    13.         fib.append(fib[-1] + fib[-2])
    14.     return fib#返回的是fib代表的列表,而不是返回变量
    15. a = mk_fib()#调用函数时,必须用(),调用函数就是执行函数的代码
    16. print(a)
    17. b = [i * 2 for i in a]
    18. print(b)
    19. with open('/tmp/fib.txt', 'w') as fobj:
    20.     # 需要把列表转成str字符串后再写入文件,否则报错
    21.     fobj.write(str(a))
    22. #############################

    函数参数:

    传递参数:

    1. def mk_fib(n):
    2.     fib = [0,1]  #函数内部的变量是局部变量,只能在函数内使用
    3.     for i in range(n - 2):
    4.         fib.append(fib[-1] + fib[-2])
    5.     return fib#返回的是fib代表的列表,而不是返回变量
    6. a = mk_fib(5)#调用函数时,必须用(),调用函数就是执行函数的代码
    7. print(a)
    8. b = [i * 2 for i in a]
    9. print(b)
    10. with open('/tmp/fib.txt', 'w') as fobj:
    11.     # 需要把列表转成str字符串后再写入文件,否则报错
    12.     fobj.write(str(a))
    13. n = int(input('长度: '))
    14. c = mk_fib(n)
    15. print(c)

    位置参数: 

    位置参数保存在sys模块的argv列表中

    import sys

    print(sys.argv)

    # python3 01.py xixi haha 123

    ['01.py', 'xixi', 'haha', '123']

    默认参数:

    1. ###默认参数###
    2. def pstar(num = 20):
    3.     print('*' * num)
    4. pstar()
    5. pstar(50)

     拷贝函数:

    1. import sys
    2. def copy(src_fname, dst_fname):
    3.     src_fobj = open(src_fname, 'rb')
    4.     dst_fboj = open(dst_fname, 'wb')
    5.     #就像商品供货的例子
    6.     while 1:
    7.         data = src_fobj.read(4096)
    8.         if data == b'':
    9.     #if len(data) == 0:
    10.     #if not data : 空串(b'')为假,取反为真
    11.             break
    12.         else:
    13.             dst_fboj.write(data)
    14.     src_fobj.close()
    15.     dst_fboj.close()
    16. copy(sys.argv[1],sys.argv[2])
    17. (nsd1907) [root@room9pc01 day03]# python 01.py /etc/fstab /tmp/cp.txt
    18. (nsd1907) [root@room9pc01 day03]# md5sum /etc/fstab /tmp/cp.txt
    19. 48ff680b643791cafc6d825ea978321/etc/fstab
    20. 48ff680b643791cafc6d825ea978321/tmp/cp.txt

    模块:

    • 一个以.py结尾的python文件就是一个模块

    • 文件代码的物理组织形式,模块是逻辑形式

    • 将文件名的.py扩展名去除,得到的就是模块名

    • 模块名也是一个名词,它也要满足相关的约定(首字符:字母下划线,后续字母数字下划线)

    1. vim star.py
    2. hi = 'hello shabichao'
    3. def pstar(n=30):
    4.     print('*' * n)
    5. >>> import star
    6. >>> star.
    7. star.hi      star.pstar( 
    8. >>> star.hi
    9. 'hello shabichao'
    10. >>> star.pstar()
    11. ******************************
    12. >>> star.pstar(50)
    13. **************************************************

    导入模块: 

    1. # import star   # 常用
    2. # print(star.hi)
    3. # star.pstar()
    4. # from random import choice, randint   # 常用
    5. # print(choice('abcd'))
    6. # print(randint(1, 100))
    7. # import sys, getpass   # 不常用
    8. import getpass as gp    # 导入模块时,给模块取别名,不常用
    9. upass = gp.getpass()
    10. print(upass)

    模块特性:

    1. (nsd1907) [root@room9pc01 day03]# echo 'print(__name__)' > foo.py
    2. (nsd1907) [root@room9pc01 day03]# echo 'import foo' > bar.py
    3. (nsd1907) [root@room9pc01 day03]# cat foo.py
    4. print(_name_)
    5. (nsd1907) [root@room9pc01 day03]# cat bar.py
    6. import foo
    7. (nsd1907) [root@room9pc01 day03]# python3 foo.py
    8. __main__
    9. (nsd1907) [root@room9pc01 day03]# python3 bar.py
    10. foo
    11. #####################调用模块或者之后使用py脚本######################
    12. hi = 'hello shabichao'#全局变量之后才可以调用
    13. def pstar(n=30):
    14.     print('*' * n)
    15. if __name__ == '__main__':
    16.     print(hi)
    17.     pstar()
    18.     pstar(50)

    生成随机密码:(作业)

    1. def mk_pass(n=8):
    2.     import string
    3.     import random
    4.     result = ''
    5.     for i in range(1,n+1):
    6.         #ms = str(random.choice(range(0,10)))
    7.         inn = random.choice(range(0,94))
    8.         all_str = string.printable
    9.         result +=  all_str[inn]
    10.     return result
    11. if __name__ == '__main__':
    12.     print(mk_pass())
    13.     print(mk_pass(4))
    14.     print(mk_pass(10))
    15. 方法二:
    16. from random import choice
    17. import string
    18. all_str = string.printable
    19. def mk_pass2(n=8):
    20.     result = ''
    21.     for i in range(n):
    22.         ch = choice(all_str)
    23.         result += ch
    24.     return result
    25. if __name__ == '__main__':
    26.     print(mk_pass2())
    27.     print(mk_pass2(4))
    28.     print(mk_pass2(10))

     

  • 相关阅读:
    关于list去除引号+报错invalid literal for int() with base 10:
    MySQL的EXPLAIN执行计划深入分析
    计算机毕业设计Javavue学习视频课程网站(源码+系统+mysql数据库+lw文档)
    AOF日志:宕机了,Redis如何避免数据丢失?
    【服务注册框架1】Eureka&nacos 两者的区别
    DDS数据分发服务
    SpringBoot整合redis
    12 款小众宝藏AI工具,90% 的开发者不了解
    计算机组成原理学习笔记:字符与字符串
    Linux进程控制
  • 原文地址:https://blog.csdn.net/zerotoall/article/details/132671004