本文共 7025 字,大约阅读时间需要 23 分钟。
文件打开方法
1.作为打开文件之门的"钥匙”,内建函数open()以及file()提供了初始化输入/输出( I/O )操作的通用接口2.成功打开文件后时候会返回一个文件对象,否则引发一个错误3.open()方法和file()方法可以完全相互替换4.基本语法:file_object = open(file_name, access_mode='r', buffering=-1)
文件模式 操作r 以读方式打开(文件不存在则报错)w 以写方式打开(文件存在则清空,不存在则创建)a 以追加模式打开(必要时创建新文件)r+ 以读写模式打开(参见r )w+ 以读写模式打开(参见w )a+ 以读写模式打开(参见a )b 以二进制模式打开
# 练习filename = input("filepath: ")fp = open(filename, mode = 'rb')file_str = fp.read()fp.close()print(file_str, end="")
文件输入
1.read()方法用来直接读取字节到字符串中,最多读取给定数目个字节2.如果没有给定size参数(默认值为-1 )或者size值为负,文件将被读取直至末尾>>> data = fobj.read()>>> print(data)
1.读取打开文件的一行(读取下个行结束符之前的所有字节)2.然后整行,包括行结束符,作为字符串返回3.它也有一个可选的size参数,默认为-1 ,代表读至行结束符4.如果提供了该参数,那么在超过size个字节后会返回不完整的行>>> data = fobj.readline()>>> print(data)
readlines()方法读取所有( 剩余的)行然后把它们作为一个字符串列表返回>>> data = fobj.readlines()>>> print(data)
1.如果需要逐行处理文件,可以结合for循环迭代文件2.迭代文件的方法与处理其他序列类型的数据类似>>> fobj = open('star.py')>>> for eachLine in fobj: print(eachLine, end= "")
文件输出
1.write()内建方法功能与read()和readline()相反。它把含有文本数据或二进制数据块的字符串写入到文件中去2.写入文件时,不会自动添加行结束标志,需要程序员手工输入>>> fobj.write('Hello World!\n')13
1.和readlines()- -样,writelines()方法是针对列表的操作2.它接受一个字符串列表作为参数,将它们写入文件3.行结束符并不会被自动加入,所以如果需要的话,必须在调用writelines()前给每行结尾加上行结束符>>> fobj.writelines(['Hello World!\n', 'python programing\n'])
操作文件
1.with语句是用来简化代码的2.在将打开文件的操作放在with语句中,代码块结束后,文件将自动关闭>>> with open('foo.py') as f: data = f.readlines() >>> f.closedTrue
1.seek(offset[ whence]) :移动文件指针到不同的位置 一 offset是相对于某个位置的偏移量 一 whence的值, 0表示文件开头, 1表示当前位置, 2表示文件的结尾2.tell() :返回当前文件指针的位置
1.程序一执行,就可以访问三个标准文件 - 标准输入:一般是键盘,使用sys.stdin - 标准输出:一般是显示器缓冲输出,使用sys.stdout - 标准错误:一般是显示器的非缓冲输出,使用sys.stderr>>> import sys>>> sys.stdout.write('hello world!\n')hello world!>>> hi = sys.stdin.readline()hello>>> hi'hello\n'
函数基本操作
1.函数是对程序逻辑进行结构化或过程化的一种编程方法2.将整块代码巧妙地隔离成易于管理的小块3.把重复代码放到函数中而不是进行大量的拷贝,这样既能节省空间,也有助于保持一致性4.通常函数都是用于实现某一种功能
1.函数是用def语句来创建的,语法如下:def function_name(arguments): "function_documentation_string" function_body_suite2.标题行由def关键字, 函数的名字,以及参数的集合(如果有的话)组成3.def 子句的剩余部分包括了一个虽然可选但是强烈推荐的文档字串,和必需的函数体
1.同大多数语言相同, python用一-对圆括号调用函数2.如果没有加圆括号,只是对函数的引用>>> def foo(): print("hello") >>> foo()hello>>> foo
1.多数情况下,函数并不直接输出数据,而是向调用者返回值2.函数的返回值使用return关键字3.没有return的话,函数默认返回None>>> def foo(): res = 3 + 4>>> i = foo()>>> print iNone# 练习 1>>> def funcl(i): x = i ** 2 return x>>> funcl(15)225>>> y = funcl(15)>>> y225# 练习 2>>> def funcl(i): x = i ** 2 print(x)>>> y = funcl(15)225>>> y
函数参数
1.形式参数 函数定义时,紧跟在函数名后(圆括号内)的参数被称为形式参数,简称形参。由于它不是实际存在变量,所以又称虚拟变量2.实际参数 在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为"实际参数",简称实参
1.调用函数时,实参的个数需要与形参个数一致2.实参将依次传递给形参>>> def foo(x, y): print('x=%d, y=%d' % (x, y))>>> foo()Traceback (most recent call last): File "", line 1, in TypeError: foo() takes exactly 2 arguments (0 given)>>> foo(3)Traceback (most recent call last): File " ", line 1, in TypeError: foo() takes exactly 2 arguments (1 given)>>> foo(3, 4)x=3, y=4# 练习def login_check(username, password): default_username="root" default_password="123456" if default_username == username and default_password == password: return Truewhile True: username = input("请输入用户名:") password = input("请输入密码:") if login_check(username, password): break else: print("login failure !", end="\n\n")
1.与shell脚本类似,程序名以及参数都以位置参数的方式传递给python程序2.使用sys模块的argv列表接收[root@666 ~]# vim args.py#!/usr/bin/env python3import sysprint sys.argv[root@666 ~]# ./args.py hello world[./args.py', 'hello', 'world'] # 练习 import sysdef fib(n): fib_list = [0, 1] if n > 2: for i in range(n-2): x = fib_list[-1] + fib_list[-2] fib_list.append(x) return fib_list# mainalist = fib(int(sys.argv[1]))print(alist)]# def2.3.py 13[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]# 练习 函数-拷贝文件import sysdef copy(src_file, dest_file): src_fp = open(src_file, 'rb') dest_fp = open(dest_file, 'wb') while True: data = src_fp.read(1048576) if data: data_fp.write(data) else: break src_fp.colse() dest_fp.colse()copy(sys.argv[1],sys.argv[2])]# copy.py /etc/hosts /tmp/zhuji.txt# 练习print("替换变量”, 变量值) %s 字符串 %d 整数 %f 浮点 %x 十六进制>>> print("%d", 100.123)%d 100.123>>> print("%d" % 100.123)100>>> print("%f" % 100)100.000000>>> print("%x" % 100)64>>> print("%.2f" % 100)100.00>>> print("%5d" % 100) 100# 练习 函数-九九乘法表def mtable(n): for i in range(1, n+1): print("%dx%d=%d" % (i,n,i*n), end="\t")for x in range(1, 10): mtable(x) print("")
1.默认参数就是声明了默认值的参数2.因为给参数赋予了默认值,所以在函数调用时,不向该参数传入值也是允许的>>> def pstar(num = 30): print('*' * num) >>> pstar()***************************************>>> pstar(40)***************************************
定义模块
1.模块是从逻辑上组织python代码的形式2.当代码量变得相当大的时候,最好把代码分成一些有组织的代码段,前提是保证它们的彼此交互3.这些代码片段相互间有一定的联系,可能是一个包含数据成员和方法的类,也可能是一组相关但彼此独立的操作函数
1.模块物理层面上组织模块的方法是文件,每一个以.py作为结尾的python文件都是一个模块2.模块名称切记不要与系统中已存在的模块重名3.模块文件名字去掉后面的扩展名( .py )即为模块名# 练习 1(foot_list.py[名字])def mtable(n): for x in range(1, n+1): for i in range(1, x+1): print("%dx%d=%d" % (i,n,i*n), end="\t") else: print("")# 练习 2>>> import foot_list>>> dir(foot_list)['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'mtable']>>> foot_list.mtable(9)1x9=91x9=9 2x9=181x9=9 2x9=18 3x9=271x9=9 2x9=18 3x9=27 4x9=361x9=9 2x9=18 3x9=27 4x9=36 5x9=451x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=541x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=631x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=721x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
使用模块
1.使用import导入模块2.模块被导入后,程序会自动生成pyc的字节码文件以提升性能3.模块属性通过"模块名属性"的方法调用4.如果仅需要模块中的某些属性,也可以单独导入>>> import sys>>> import os, string>>> string.digits'0123456789'>>> from random import randint>>> randint(1,10)3# 练习import foot_listimport os, sysfoot_list.mtable(9)
1.一个模块只被加载一 次,无论它被导入多少次2.只加载一-次可以阻止多重导入时代码被多次执行3.如果两个文件相互导入,防止了无限的相互加载4.模块加载时,顶层代码会自动执行,所以只将函数放入模块的顶层是良好的编程习惯
1.模块具有一个 __name__ 特殊属性2.当模块文件直接执行时,__name__的值为'__main__'3.当模块被另一个文件导入时, __name__的值就是该模块的名字[root@666 ~]# vim foo.py#!/usr/bin/env python3print(__name__)[root@666 ~]# ./foo.py__main__[root@666 ~]# python>>> import foofoo
生成随机密码
1.编写一个能生成8位随机密码的程序2.使用random的choice函数随机取出字符3.改进程序,用户可以自己决定生成多少位的密码
# 练习 1import randomallchr = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM-_#'pwdstr = ''for i in range(8): pwdstr += random.choice(allchr)print(pwdstr)# 练习 2from random import choiceimport stringall_chs = string.ascii_letters + string.digitsdef gen_pass(n=8): result = '' for i in range(n): ch = choice(all_chs) result += ch return resultif __name__ == '__main__': print(gen_pass()) print(gen_pass(4)) print(gen_pass(10))
转载地址:http://ihnwi.baihongyu.com/