{{ selected_gold.title }}

  • ¥ {{ selected_gold.original_price }}
  • ¥ {{ selected_gold.price }}
  • {{ selected_gold.number_of_order }} 人订阅
  • {{ selected_gold.total_likers_count }}
    由 {{ selected_gold.creator_name }} 编辑

    {{ title }}

    请登录购买({{ selected_gold.price }}元),即可解锁剩余教程
    点击购买

    • Air
    • 2018年9月20日

    Python程序的输入与输出

    计算机是由许多硬件组成的,这些硬件包括CPU,内存,硬盘,网卡等等。当我们运行一个Python程序的时候,CPU硬件将会被调度起来,如果我们的Python程序要处理大量的数据,那么这个时候就要到硬盘中读取或写入数据。从磁盘中读写数据是一个非常常见的使用场景,因此接下来的内容将涉及Python的读写特性。

    程序的输入和输出有很多种方式。比如程序处理好数据之后,可以打印(输出)到控制台,也可以输出到文件以供未来使用,同样我们也可以通过键盘输入数据到程序中用于控制程序,也可以把文件中的数据读到程序中用于初始化程序。这一章将按照以下内容来讨论Python的输入和输出。

    • 输入(input)和输出(output)
    • 文件(file)IO
    • 网络IO
    • Unicode

    输入(input)和输出(output)

    有许多程序都是通过命令行来与用户交互的,比如我们常见的git cmd应用。在使用Python编写程序时,使用input来接收用户输入的指令,使用print来输出程序处理的结果。接下来我们看看一个判断奇偶数的例子:

    nb = int(input("Please enter 0-9 number: "))
    if nb % 2:
        print("Number %d is a even number" % nb)
    else:
        print("Number %d is a odd number" % nb)
    

    input 函数接收一个字符串然后显示给用户。接着这个函数等待用户输入数据以及按下回车键作为结束,最后该函数将返回用户输入的数据。程序获得用户输入的数据之后将其转成int类型,然后使用print函数将其打印到控制台上,以便用户看到程序的输出结果。

    文件(file)IO

    Python提供了文件对象用于从磁盘文件中读取(输入)和写入(输出)数据。文件对象提供了几个函数用于输入和输出,比如readreadlinewrite。使用文件对象之前,需要用open函数创建一个文件对象,当完成读写文件操作之后,需要使用close函数来结束文件的读写操作。以下是几个关于Python文件读写操作的例子:

    wwb方式将数据写入文件

    data_out = 'digwebs是一个简单的web框架'
    # open file in `w`rite mode
    f = open('data_file_1','w')
    f.write(data_out)
    f.close()
    
    # open file in `w`rite `b`inary mode
    f = open('data_file_2','wb')
    f.write(data_out.encode('utf-8'))
    f.close()
    

    rrb方式读取文件中的数据

    # open file in `r`ead mode
    f = open('data_file_1','r')
    content = f.read()
    print(content)
    
    # open file in `r`ead `b`inary mode
    f = open('data_file_2','rb')
    content = f.read()
    print(content.decode('utf-8'))
    

    digwebs是一个简单的web框架的各种编码如下: UTF-8编码

    64 69 67 77 65 62 73 E6 98 AF E4 B8 80 E4 B8 AA
    E7 AE 80 E5 8D 95 E7 9A 84 77 65 62 E6 A1 86 E6
    9E B6 
    

    Unicode编码

    64:69:67:77:65:62:73:662f:4e00:4e2a:7b80:5355:7684:77:65:62:6846:67b6
    

    在类Unix系统中,当以w的模式写文件的时候,digwebs是一个简单的web框架转化为UTF-8的字节数组,最后写到文件中。当以r的模式读文件的时候,首先会将UTF-8编码的数据从磁盘读取出来,接着转成Unicode编码的数据,进而提供给程序使用。在Window操作系统中就不一定是以UTF-8编码的方式写到文件中了。

    网络IO

    有时候我们希望自己写的Python程序能够与其它计算机进行交互,那么就需要Python提供与其它计算机通信的模块。我们把多台计算机之间的交互统一称为网络IO。为了解决网络IO的问题,Python提供了2种类型的网络模块,一种是底层的socket(套接字),另外一种是应用层的模块。通过下图可以很好的理解它们之间的关系。

    应用层(Application)通信(HTTP,FTP)是通过底层socket(Transport)来实现网络IO的,当然我们也可以直接使用socket(Transport)来实现网络IO。无论是哪种类型的网络IO,其本质都是将数据转移到另外一台计算机上,而且这些数据都是以字节流(bytes)的方式传输的。因此,当使用Python来传输数据的时候,我们需要把数据转化成字节流(bytes)的形式,然后再使用网络模块把转化之后的结果发送到另外一台计算机。网络IO与文件IO的逻辑概念是一样的,都有读写操作,网络IO的接收对应着读取(读取来自其它计算机的数据),网络IO的发送对应着写入(将数据写到其它计算机),只不过网络IO的数据转移到了其它计算机,而文件IO的数据转移到了本地磁盘。在使用Python来写网络应用的时候,需要学习网络编程的知识,而网络编程又包括了很多概念,这些概念很难在一篇文章中说完,因此读者可以参考其它资料来学习网络编程。接下来让我们以stackoverflow这个网络服务来认识一下网络编程的复杂性: Stack Overflow的服务架构图

    上图的每一个节点都对应着1台或多台计算机,每台计算机的职责非常单一,比如Cache节点就是处理缓存,加快访问速度的。到底有多少台计算机来支撑Stack Overflow的服务呢?接下来看看下图

    Unicode

    在上面的例子中,有2个类型需要注意,它们分别是strbytes。在Python3中,str类型的对象是Unicode编码的。str类型的对象可通过encode('utf-8')转化成bytes类型的对象,这个过程叫编码(encoding)。同样bytes类型的对象可以通过decode('utf-8')转化成str类型的对象,这个过程叫解码(decoding)。以上读写文件的示例代码中用了2种文件读写模式rb、rwb、w。当以rbwb读写文件的时候,读取或者写入的数据必须是bytes类型,而当以rw读写文件的时候,读取或者写入的数据必须是str类型。关于字符串类型的编码知识,你可以参考这篇文章

    总结

    本文介绍了Python读写IO的能力,其中本地文件IO和网络IO是非常重要的功能,利用这些功能,你可以编写程序来与其它程序通信(要么是通过文件或者通过通信协议)。如果一切正常,你编写的程序将会24小时工作,然而,计算机的世界里有太多的不确定性,比如程序出现bug,那么如何处理和解决bug也是另外一个不可或缺的能力,这需要Python的异常处理能力来完成。