目录:
一、界面I/O
二、文件I/O
一、界面I/O
我也不知道这么称呼是否贴切,python首先要提到的就是用户交互界面的输入与输出,即键盘输入与页面输出,对应的函数为input()
和print()
。这里重申下概念,其实我们一直有在使用了。
关于input()的小技巧就是,input()也可以作为输出在界面打印出内容,但是!该内容不可作为键盘输入使用!详见第二章基本逻辑部分。
print('输入不合法')
print("")
input("点击 enter 键返回首页") #对,像这样~
print("")
关于print(),其实我们之前已经提到过格式化的问题了,再重申一点:因为 str.format()
是比较新的函数, 大多数的 Python 代码仍然使用 % 操作符。但是因为这种旧式的格式化最终会从该语言中移除, 应该更多的使用 str.format()
。
但格式化问题解决的是如何让输出中包含自定义内容,但对杂乱的结果怎么处理?如果强制字符串输出,这里补充两个函数 repr()
和str()
a='hello.,\t\t\t\t\tworld'
print('str()函数转化结果:{}'.format(str(a)))
print('repr()函数转化结果:{}'.format(repr(a)))
#输出:
str()函数转化结果:hello., world
repr()函数转化结果:'hello.,\t\t\t\t\tworld'
区别显而易见,str()旨在返回一个用户易读的表达形式,repr()旨在返回一个解释器易读的表达形式,所以后者将特殊符号一并返回,无视转义。
二、文件I/O
1、文件创建
open()函数用以创建一个file对象,所有的读写操作也都是基于这个对象的。基本语法格式为open(filename, mode)
,其中mode即为打开文件的模式,拓展如下:
r
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
r+
打开一个文件用于读写。文件指针将会放在文件的开头。
rb+
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w
打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb
以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+
打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+
以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
2、文件写入
文件写入方式很单一,即open()方法,但值得一提的是,请务必要调用f.close()
来关闭文件。
因为当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
综合文件创建于写入,我们来改写我们第六章提到的异常处理小例子,把它改成日志记录异常吧。
import time
def error():
try:
a=1/0
print(a)
except ZeroDivisionError:
print('你没错,老板说的都对')
f = open('C:/Users/rabbitmask/Desktop/Source code/Python/AuotScan/bao/log.txt', 'a+')
f.write('异常发生时间为:{}\n'.format(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))))
f.close()
finally:
print('我不管,反正程序运行完了')
f = open('C:/Users/rabbitmask/Desktop/Source code/Python/AuotScan/bao/log.txt', 'a+')
f.write('当前函数运行结束,时间为:{}\n'.format(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))))
f.close()
if __name__=='__main__':
error()
#输出:
你没错,老板说的都对
我不管,反正程序运行完了
#log.txt
异常发生时间为:2019-01-18 10:12:57
当前函数运行结束,时间为:2019-01-18 10:12:57
于是我们成功做了一个简单的日志文件,用来记录我们的程序运行状态。
3、文件读取
先看概念,再看例子:
f.read(size)
为了读取一个文件一定数目的数据, 然后作为字符串或字节对象返回。
f.read()
当上述size为空或者为负, 那么该文件的所有内容都将被读取并且返回。
f.readline()
从文件中读取单独的一行。换行符为 '\n'。如果返回一个空字符串, 说明已经已经读取到最后一行。
f.readlines()
将返回该文件中包含的所有行,包含特殊字符,拒绝转义。
def file():
f = open('C:/Users/rabbitmask/Desktop/Source code/Python/AuotScan/bao/log.txt','r')
a=f.read(10)
f.close()
f = open('C:/Users/rabbitmask/Desktop/Source code/Python/AuotScan/bao/log.txt', 'r')
b=f.read()
f.close()
f = open('C:/Users/rabbitmask/Desktop/Source code/Python/AuotScan/bao/log.txt', 'r')
c=f.readline()
f.close()
f = open('C:/Users/rabbitmask/Desktop/Source code/Python/AuotScan/bao/log.txt', 'r')
d=f.readlines()
f.close()
print('a:\n', a)
print('b:\n', b)
print('c:\n', c)
print('d:\n', d)
if __name__=='__main__':
file()
#输出
a:
异常发生时间为:20
b:
异常发生时间为:2019-01-18 10:12:57
当前函数运行结束,时间为:2019-01-18 10:12:57
c:
异常发生时间为:2019-01-18 10:12:57
d:
['异常发生时间为:2019-01-18 10:12:57\n', '当前函数运行结束,时间为:2019-01-18 10:12:57\n']
大家结合上面的概念于例子对应理解(顺序相同),还有一个小细节,看输出的内容,b于c之间,c于d之间,是有个空行的,而a、d后面没有,原因是因为在文件写入是我们的确写了,但a还没有读到转义符,d将转义符强行输出,所以都没有产生换行效果。
到这里基础过的差不多了,关于os操作那块,目前觉得os.system('command')
基本满足日常了,还是那个思路,具体内置函数或方法,我们尽可能多的提及,但不做展开。