Python入门系列(七)——I/O

目录:
一、界面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')基本满足日常了,还是那个思路,具体内置函数或方法,我们尽可能多的提及,但不做展开。

    原文作者:RabbitMask
    原文地址: https://www.jianshu.com/p/8ddad27302e6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞