本站以分享各种运维经验和运维所需要的技能为主
《python》:python零基础入门学习
《shell》:shell学习
《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战
《k8》暂未更新
《docker学习》暂未更新
《ceph学习》ceph日常问题解决分享
《日志收集》ELK+各种中间件
《运维日常》持续更新中
文件对象
操作步骤: 打开 , 读写 , 关闭
open内建函数:
访问模式:
# cp /etc/passwd /tmp/
>>> f = open('/tmp/password') -----默认r模式,文件不存在则报错
Traceback (most recent call last):File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/password'
>>> f = open('/tmp/passwd')
>>> data = f.
f.buffer f.encoding f.isatty( f.newlines f.readlines( f.truncate(
f.close( f.errors f.line_buffering f.read( f.seek( f.writable(
f.closed f.fileno( f.mode f.readable( f.seekable( f.write(
f.detach( f.flush( f.name f.readline( f.tell( f.writelines(
>>> data = f.read()
>>> data
>>> data = f.read() 文件指针已到结尾,再读取将为空串-----指针没有回头草
>>> data
''
>>> f.close()
>>> f = open('/tmp/passwd')
>>> data = f.read()
>>> data
>>> f.read(4)---读取4字节
'root'
>>> f.read(6)---继续往后读6字节
':x:0:0'
>>> f.readline()读到换行符\n结束 ----类型是 str 字符类型
>>> f.readlines()--# 把每一行数据读出来放到列表中
':root:/root:/bin/bash\n'
>>> data = f.readlines()
>>> type(data)
<class 'list'>
>>> data###############最常用的读取文件的方法#################
f = open('/tmp/passwd')
for line in f:print(line, end='')
f.close()##############################
f = open('图片地址', 'rb') # 打开非文本文件要加参数b
f.read(4096)
f.close()
[root@room9pc01 ~]# eog me1.png
打开图片
*************文本也可以用rb的方式打开*******
#一个英文字符正好占一个字节,就用英文字符本身去显示
但是一个汉子再utf9编码中占3字节,没有办法把一个字节表示成字符,所以就用16进制数表示
# cat /tmp/a.txt
hello一月份
>>> f = open('/tmp/a.txt','rb')
>>> f.read()
b'hello\xe4\xb8\x80\xe6\x9c\x88\xe4\xbb\xbd\n'
>>> s1 = b'\xe4\xb8\x80'
>>> s1
b'\xe4\xb8\x80'
>>> s1.decode()
'一'
f.close()
>>> s2 = '月'
>>> s2.encode()
b'\xe6\x9c\x88'
*******************************************##################################
f = open('/tmp/myfile', 'w') # 'w'打开文件,如果文件不存在则创建
f.write('hello world!\n')
f.flush() # 立即将缓存中的数据同步到磁盘
f.writelines(['2nd line.\n', 'new line.\n'])
f.close() # 关闭文件的时候,数据保存到磁盘##############################
with语句结束时,自动关闭文件with open('/tmp/passwd') as f:print(f.readline())#########################
移动指针的位置以及查看指针的位置
--f = open('/tmp/passwd', 'rb') ---一定要rbf = open('/tmp/passwd')
f.tell() # 查看文件指针的位置
f.readline()
f.tell()
f.seek(0, 0) # 第一个数字是偏移量,第2位是数字是相对位置。# 相对位置0表示开头,1表示当前,2表示结尾
f.seek(-5,2) #左为负 右为正f.tell()
f.close()
拷贝文件:
# f1 = open('/bin/ls', 'rb')
# f2 = open('/tmp/list', 'wb')
#
# data = f1.read()
# f2.write(data)
#
# f1.close()
# f2.close()
[root@room9pc01 tmp]# md5sum /bin/ls /tmp/list
a78c13d806e594dc4014d145d689f23d /bin/ls
a78c13d806e594dc4014d145d689f23d /tmp/listsrc_fname = '/bin/ls'
dst_fname = '/tmp/list2'src_fobj = open(src_fname, 'rb')
dst_fboj = open(dst_fname, 'wb')#就像商品供货的例子while 1:data = src_fobj.read(4096)if data == b'':
#if len(data) == 0:
#if not data : 空串(b'')为假,取反为真breakelse:dst_fboj.write(data)src_fobj.close()
dst_fboj.close()
函数:
-
使用def定义
-
调用函数务必使用()
-
函数一般都需要有一个返回值
-
返回值使用return关键字指定
-
没有return默认返回None
>>> def add():
... result = 10 + 20
...
>>> a = add()
>>> print(a)
None
------通过上面的例子可以知道,需要return返回值,不然只会默认输出None----###########函数############
def mk_fib():fib = [0,1] #函数内部的变量是局部变量,只能在函数内使用n = int(input('长度: '))for i in range(n - 2):fib.append(fib[-1] + fib[-2])return fib#返回的是fib代表的列表,而不是返回变量a = mk_fib()#调用函数时,必须用(),调用函数就是执行函数的代码
print(a)
b = [i * 2 for i in a]
print(b)
with open('/tmp/fib.txt', 'w') as fobj:# 需要把列表转成str字符串后再写入文件,否则报错fobj.write(str(a))
#############################
函数参数:
传递参数:
def mk_fib(n):fib = [0,1] #函数内部的变量是局部变量,只能在函数内使用for i in range(n - 2):fib.append(fib[-1] + fib[-2])return fib#返回的是fib代表的列表,而不是返回变量a = mk_fib(5)#调用函数时,必须用(),调用函数就是执行函数的代码
print(a)
b = [i * 2 for i in a]
print(b)
with open('/tmp/fib.txt', 'w') as fobj:# 需要把列表转成str字符串后再写入文件,否则报错fobj.write(str(a))n = int(input('长度: '))
c = mk_fib(n)
print(c)
位置参数:
位置参数保存在sys模块的argv列表中
import sys
print(sys.argv)
# python3 01.py xixi haha 123
['01.py', 'xixi', 'haha', '123']
默认参数:
###默认参数###
def pstar(num = 20):print('*' * num)pstar()
pstar(50)
拷贝函数:
import sys
def copy(src_fname, dst_fname):src_fobj = open(src_fname, 'rb')dst_fboj = open(dst_fname, 'wb')#就像商品供货的例子while 1:data = src_fobj.read(4096)if data == b'':#if len(data) == 0:#if not data : 空串(b'')为假,取反为真breakelse:dst_fboj.write(data)src_fobj.close()dst_fboj.close()copy(sys.argv[1],sys.argv[2])(nsd1907) [root@room9pc01 day03]# python 01.py /etc/fstab /tmp/cp.txt
(nsd1907) [root@room9pc01 day03]# md5sum /etc/fstab /tmp/cp.txt
48ff680b643791cafc6d825ea978321f /etc/fstab
48ff680b643791cafc6d825ea978321f /tmp/cp.txt
模块:
-
一个以.py结尾的python文件就是一个模块
-
文件代码的物理组织形式,模块是逻辑形式
-
将文件名的.py扩展名去除,得到的就是模块名
-
模块名也是一个名词,它也要满足相关的约定(首字符:字母下划线,后续字母数字下划线)
vim star.py
hi = 'hello shabichao'
def pstar(n=30):print('*' * n)>>> import star
>>> star.
star.hi star.pstar(
>>> star.hi
'hello shabichao'
>>> star.pstar()
******************************
>>> star.pstar(50)
**************************************************
导入模块:
# import star # 常用
# print(star.hi)
# star.pstar()
# from random import choice, randint # 常用
# print(choice('abcd'))
# print(randint(1, 100))
# import sys, getpass # 不常用
import getpass as gp # 导入模块时,给模块取别名,不常用
upass = gp.getpass()
print(upass)
模块特性:
(nsd1907) [root@room9pc01 day03]# echo 'print(__name__)' > foo.py
(nsd1907) [root@room9pc01 day03]# echo 'import foo' > bar.py
(nsd1907) [root@room9pc01 day03]# cat foo.py
print(_name_)
(nsd1907) [root@room9pc01 day03]# cat bar.py
import foo
(nsd1907) [root@room9pc01 day03]# python3 foo.py
__main__
(nsd1907) [root@room9pc01 day03]# python3 bar.py
foo#####################调用模块或者之后使用py脚本######################
hi = 'hello shabichao'#全局变量之后才可以调用
def pstar(n=30):print('*' * n)if __name__ == '__main__':print(hi)pstar()pstar(50)
生成随机密码:(作业)
def mk_pass(n=8):import stringimport randomresult = ''for i in range(1,n+1):#ms = str(random.choice(range(0,10)))inn = random.choice(range(0,94))all_str = string.printableresult += all_str[inn]return resultif __name__ == '__main__':print(mk_pass())print(mk_pass(4))print(mk_pass(10))方法二:from random import choice
import stringall_str = string.printabledef mk_pass2(n=8):result = ''for i in range(n):ch = choice(all_str)result += chreturn resultif __name__ == '__main__':print(mk_pass2())print(mk_pass2(4))print(mk_pass2(10))