nsd1905_py01_day03

文件对象

操作文件的步骤

  • 打开文件
  • 读写文件
  • 关闭文件

读取文本文件

  1. (nsd1905) [root@room8pc16 day03]# cp /etc/passwd /tmp/
  2. >>> f = open('/tmp/password') # 默认以r方式打开,文件不存在则报错
  3. >>> f = open('/tmp/passwd')
  4. >>> data = f.read() # read默认读取全部数据
  5. >>> data # 显示data变量的内容,是一个大字符串,文件的行尾换行符使用\n表示
  6. >>> print(data) # print将\n转义为回车换行
  7. >>> data = f.read() # 这不是再读一遍,而是继续向后读取
  8. >>> data
  9. ''
  10. >>> f.close() # 关闭文件
  11. >>> f = open('/tmp/passwd')
  12. >>> f.read(4) # 读取4字节
  13. 'root'
  14. >>> f.read(1) # 读取1字节
  15. ':'
  16. >>> f.readline() # 从文件指针开始到该行结尾,即读一行
  17. 'x:0:0:root:/root:/bin/bash\n'
  18. >>> f.readline()
  19. 'bin:x:1:1:bin:/bin:/sbin/nologin\n'
  20. >>> f.readlines() # 将文件内容读到列表中,每行是列表的一项
  21. >>> f.close()
  22. # 重要、常用的遍历文件的方法
  23. >>> f = open('/tmp/passwd')
  24. >>> for line in f:
  25. ... print(line, end='')
  26. >>> f.close()

读取非文本文件的方法

  1. >>> f = open('/bin/ls')
  2. >>> f.read(10) # python试图将读取的10个字节转换成字符,但是无法转换,报错
  3. >>> f.close()
  4. >>> f = open('/bin/ls', 'rb') # b表示bytes类型。
  5. # 读取10个字节,如果一个字节正好可以表示为一个英文字符,就以字符(str)显示,否则,将1个字节转换成2个16进制数表示。
  6. >>> f.read(10) # 建议读4096的倍数那么多数据
  7. b'\x7fELF\x02\x01\x01\x00\x00\x00'
  8. >>> f.close()

写入文本文件

  1. >>> f = open('/tmp/passwd', 'w') # 以w方式打开文件,将清空或创建文件
  2. (nsd1905) [root@room8pc16 day03]# cat /tmp/passwd # 空文件
  3. >>> f.write('hello world!\n')
  4. 13 # 表示写入13字节
  5. (nsd1905) [root@room8pc16 day03]# cat /tmp/passwd # 仍然无内容
  6. >>> f.flush() # 立即将数据同步至磁盘
  7. (nsd1905) [root@room8pc16 day03]# cat /tmp/passwd
  8. hello world!
  9. >>> f.writelines(['new line.', 'ni hao', 'how are you?'])
  10. >>> f.close()
  11. # 多出一行,因为写入时没有使用\n
  12. (nsd1905) [root@room8pc16 day03]# cat /tmp/passwd

写入非文本文件(以bytes类型写入)

  1. >>> s1 = 'hello 中国'
  2. >>> type(s1) # 无论是英文还是中文字符,都是字符str
  3. <class 'str'>
  4. >>> s1.encode() # 将str类型转为bytes类型
  5. b'hello \xe4\xb8\xad\xe5\x9b\xbd'
  6. >>> data = s1.encode()
  7. >>> type(data)
  8. <class 'bytes'>
  9. >>> data
  10. b'hello \xe4\xb8\xad\xe5\x9b\xbd'
  11. >>> data.decode() # 将bytes类型转成str类型
  12. 'hello 中国'
  13. >>> f = open('/tmp/mytest.txt', 'wb')
  14. >>> f.write(data)
  15. 12
  16. >>> f.close()

with语句

通过with打开文件,with语句结束时,文件自动关闭

  1. >>> with open('/tmp/passwd') as f:
  2. ... f.readline()
  3. ...
  4. 'hello world!\n'
  5. >>> f.readline() # 报错,因为文件已经关闭了。

seek移动文件指针

  1. # seek(偏移量, 位置) 位置:0表示开头,1表示当前位置,2表示结尾
  2. >>> f = open('/tmp/passwd', 'rb')
  3. >>> f.seek(16, 0) # 从开头向右移动16字节
  4. 16
  5. >>> f.read(5)
  6. b'/root'
  7. >>> f.seek(-16, 2) # 从结尾向左移动16字节
  8. 2740 # 2740是从开头到指针位置的偏移量
  9. >>> f.read()
  10. b'jerry:/bin/bash\n'
  11. >>> f.close()

函数

  • 函数一般用于实现某一功能
  • 它实现了代码的重用
  • 函数定义时,函数内的代码块不会执行
  • 执行函数内的代码,需要通过一对小括号进行调用
  1. def 函数名(参数):
  2. 代码块

返回值

  • 返回值就是函数处理数据的结果
  • 使用关键字return来返回结果
  • 如果没有return语句,默认返回None
  • 函数的返回值,可以返回任意的数据,但是应该合理

参数

  • 参数是可选的
  • 函数需要处理的数据应该通过参数进行传递
  1. >>> def show(data):
  2. ... print('数据:', data)
  3. ...
  4. >>> with open('/tmp/passwd') as f:
  5. ... for line in f:
  6. ... show(line)
  7. >>> a = input('data: ')
  8. data: hello world
  9. >>> show(a)
  10. 数据: hello world

位置参数

  • python将位置参数保存到了sys模块的argv列表
  • 与shell的$1 / $2等表示一样的含义
  • 位置参数的数据类型都是字符串

默认参数

  • 为参数添加了默认值
  1. >>> def pstar(n=30):
  2. ... print('*' * n)
  3. ...
  4. >>> pstar()
  5. ******************************
  6. >>> pstar(20)
  7. ********************

模块

  • 一个以.py结尾的程序文件就是一个模块
  • 文件是python物理上组织代码的形式
  • 模块是逻辑上组织代码的形式
  • 模块名也是一个名字,可用字符的要求与变量名一样
  1. # vim star.py
  2. '''打印星号
  3. 这是一个演示用的模块,只包含了一个全局变量和一个函数
  4. '''
  5. hi = 'Hello World'
  6. def pstar(n=30):
  7. '缺省打印30个星号'
  8. print('*' * n)
  9. >>> import star
  10. >>> star.hi
  11. 'Hello World'
  12. >>> star.pstar()
  13. ******************************
  14. >>> help(star) # 查看模块的帮助信息

导入模块的方法

  1. # 直接导入,常用
  2. >>> import sys
  3. >>> sys.argv
  4. ['']
  5. # 仅导入模块中的某些方法,常用
  6. >>> from random import choice, randint
  7. >>> choice('abcd')
  8. 'a'
  9. >>> randint(1, 100)
  10. 54
  11. # 一行导入多个模块,不常用
  12. >>> import time, os
  13. # 导入模块时,为模块定义别名,不常用1
  14. >>> import getpass as gp
  15. >>> a = gp.getpass()
  16. Password:
  17. >>> a
  18. 'abc'

模块的导入和加载

  • import是导入模块
  • 第一次导入模块时,模块中的代码会执行一遍,这个叫加载,即load
  • 无论导入多少次,只会加载一次

模块导入的特性

  • 每个模块都有一个名为name的变量
  • name它的值,可能是main,也可能是模块名
    • 当程序文件作为脚本,直接运行时,值为main
    • 当程序文件作为模块,被导入时,值为模块名
  1. (nsd1905) [root@room8pc16 day03]# cat foo.py
  2. print(__name__)
  3. (nsd1905) [root@room8pc16 day03]# cat bar.py
  4. import foo
  5. (nsd1905) [root@room8pc16 day03]# python foo.py
  6. __main__
  7. (nsd1905) [root@room8pc16 day03]# python bar.py
  8. foo