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

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

《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') ---一定要rb

f = 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/list


src_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'')为假,取反为真
        break
    else:
        dst_fboj.write(data)

src_fobj.close()
dst_fboj.close()

函数:

  1. 使用def定义

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

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

  • 返回值使用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'')为假,取反为真
            break
        else:
            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 string
    import random
    result = ''
    for i in range(1,n+1):
        #ms = str(random.choice(range(0,10)))
        inn = random.choice(range(0,94))

        all_str = string.printable

        result +=  all_str[inn]
    return result

if __name__ == '__main__':
    print(mk_pass())
    print(mk_pass(4))
    print(mk_pass(10))

方法二:

from random import choice
import string

all_str = string.printable

def mk_pass2(n=8):
    result = ''
    for i in range(n):
        ch = choice(all_str)
        result += ch
    return result

if __name__ == '__main__':
    print(mk_pass2())
    print(mk_pass2(4))
    print(mk_pass2(10))

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值