由浅及深讲讲Python的输入和输出

一、输入输出基础

最简单直接的输入来自键盘操作,比如下面这个例子

name = input('your name:')
gender = input('you are a boy?(y/n)')###### 输入 ######
your name:Jack
you are a boy?welcome_str = 'Welcome to the matrix {prefix} {name}.'
welcome_dic = {'prefix': 'Mr.' if gender == 'y' else 'Mrs','name': name
}print('authorizing...')
print(welcome_str.format(**welcome_dic))########## 输出 ##########
authorizing...
Welcome to the matrix Mr. Jack.

input()函数暂停程序运行,同时等待键盘输入直到回车被按下,函数的参数即为提示语,输入的类型永远是字符串型(str)。print()函数则接受字符串、数字、字典、列表甚至一些自定义类的输出

a = input()
1
b = input()
2print('a + b = {}'.format(a + b))
########## 输出 ##############
a + b = 12
print('type of a is {}, type of b is {}'.format(type(a), type(b)))
########## 输出 ##############
type of a is <class 'str'>, type of b is <class 'str'>
print('a + b = {}'.format(int(a) + int(b)))
########## 输出 ##############
a + b = 3

注意:
str强制转换为int请用int(),转为浮点数请用float()
而在生产环境中使用强制转换时,请记得加上try except

Python对int类型没有最大限制(相比之下,C++的int最大为2147483647,超过这个数字会产生溢出),但是对float类型依然有精度限制
这些特点,在生产环境中要时刻提防,避免因为对边界条件判断不清而造成bug甚至危重安全漏洞

虽然输入输出和类型处理事情简单,但一定要慎之又慎。毕竟相当比例的安全漏洞,都来自随意的I/O处理

二、文件输入输出

命令行的输入输出,只是Python交互的最基本方式,适用一些简单小程序的交互。而生产级别的Python代码,大部分I/O则来自于文件、网络、其他进程的消息等等

接下来,详细分析一个文本文件读写。假设有一个文本文件in.txt,内容如下:


I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin but by the content of their character. I have a dream today.I have a dream that one day down in Alabama, with its vicious racists, . . . one day right there in Alabama little black boys and black girls will be able to join hands with little white boys and white girls as sisters and brothers. I have a dream today.I have a dream that one day every valley shall be exalted, every hill and mountain shall be made low, the rough places will be made plain, and the crooked places will be made straight, and the glory of the Lord shall be revealed, and all flesh shall see it together.This is our hope. . . With this faith we will be able to hew out of the mountain of despair a stone of hope. With this faith we will be able to transform the jangling discords of our nation into a beautiful symphony of brotherhood. With this faith we will be able to work together, to pray together, to struggle together, to go to jail together, to stand up for freedom together, knowing that we will be free one day. . . .And when this happens, and when we allow freedom ring, when we let it ring from every village and every hamlet, from every state and every city, we will be able to speed up that day when all of God's children, black men and white men, Jews and Gentiles, Protestants and Catholics, will be able to join hands and sing in the words of the old Negro spiritual: "Free at last! Free at last! Thank God Almighty, we are free at last!"

好,接下来完成一个简单的 NLP(自然语言处理)任务

首先,要清楚 NLP 任务的基本步骤,也就是下面的四步:

  1. 读取文件
  2. 去除所有标点符号和换行符,并把所有大写变成小写
  3. 合并相同的词,统计每个词出现的频率,并按照词频从大到小排序
  4. 将结果按行输出到文件out.txt

用Python如何解决这个问题呢?一起来看下这段代码

import re# 你不用太关心这个函数
def parse(text):# 使用正则表达式去除标点符号和换行符text = re.sub(r'[^\w ]', ' ', text)# 转为小写text = text.lower()# 生成所有单词的列表word_list = text.split(' ')# 去除空白单词# filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。它可以检查列表中的任何None值并删除它们并形成一个没有None值的过滤列表word_list = filter(None, word_list)# 生成单词和词频的字典word_cnt = {}for word in word_list:if word not in word_cnt:word_cnt[word] = 0word_cnt[word] += 1# 按照词频排序sorted_word_cnt = sorted(word_cnt.items(), key=lambda kv: kv[1], reverse=True)return sorted_word_cntwith open('in.txt', 'r') as fin:text = fin.read()word_and_freq = parse(text)with open('out.txt', 'w') as fout:for word, freq in word_and_freq:fout.write('{} {}\n'.format(word, freq))########## 输出(省略较长的中间结果) ##########and 15
be 13
will 11
to 11
the 10
of 10
a 8
we 8
day 6...old 1
negro 1
spiritual 1
thank 1
god 1
almighty 1
are 1

首先需要先了解一下,计算机中文件访问的基础知识。事实上,计算机内核(kernel)对文件的处理相对比较复杂,涉及到内核模式、虚拟文件系统、锁和指针等一系列概念

先用open()函数拿到文件的指针
其中,第一个参数指定文件位置(相对位置或者绝对位置),第二个参数,如果是r表示读取,如果是w则表示写入,当然也可以用rw,表示读写都要,a则是一个不太常用的参数,表示追加(append),这样打开的文件,如果需要写入,会从原始文件的最末尾开始写入

在拿到指针后,可以通过read()函数来读取文件的全部内容。代码text = fin.read()即表示把文件所有内容读取到内存中,并赋值给变量 text。这么做自然也是有利有弊:

  • 优点是方便,接下来我们可以很方便地调用parse函数进行分析
  • 缺点是如果文件过大,一次性读取可能造成内存崩溃

这时,可以给read指定参数size,用来表示读取的最大长度。还可以通过readline()函数,每次读取一行,这种做法常用于数据挖掘(Data Mining)中的数据清洗,在写一些小的程序时非常轻便。如果每行之间没有关联,这种做法也可以降低内存的压力。而write()函数,可以把参数中的字符串输出到文件中

这里需要简单提一下with语句,open()函数对应于close()函数,也就是说如果打开了文件,在完成读取任务后就应该立刻关掉它。而如果使用了with语句就不需要显式调用close()。在with 的语境下任务执行完毕后,close()函数会被自动调用,代码也可以更简洁

最后需要注意的是,所有I/O都应该进行错误处理。因为I/O操作可能会有各种各样的情况出现,而一个健壮(robust)的程序需要能应对各种情况的发生,而不应该崩溃

三、JSON 序列化与实战

最后,讲一个和实际应用很贴近的知识点

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它的设计意图是把所有事情都用设计的字符串来表示,这样既方便在互联网上传递信息,也方便人进行阅读(相比一些binary的协议)
JSON在当今互联网中应用非常广泛,也是每一个用Python程序员应当熟练掌握的技能点

设想一个情景,要向交易所购买一定数额的股票。那么,需要提交股票代码、方向(买入/卖出)、订单类型(市价/限价)、价格(如果是限价单)、数量等一系列参数,而这些数据里有字符串,有整数,有浮点数,甚至还有布尔型变量,全部混在一起并不方便交易所解包

那该怎么办呢?其实,JSON正能解决这个场景,可以把它简单地理解为两种黑箱:

  • 第一种,输入这些杂七杂八的信息,比如Python字典,输出一个字符串
  • 第二种,输入这个字符串,可以输出包含原始信息的Python字典

具体代码如下:

import jsonparams = {'symbol': '123456','type': 'limit','price': 123.4,'amount': 23
}params_str = json.dumps(params)print('after json serialization')
print('type of params_str = {}, params_str = {}'.format(type(params_str), params))original_params = json.loads(params_str)print('after json deserialization')
print('type of original_params = {}, original_params = {}'.format(type(original_params), original_params))########## 输出 ##########after json serialization
type of params_str = <class 'str'>, params_str = {'symbol': '123456', 'type': 'limit', 'price': 123.4, 'amount': 23}
after json deserialization
type of original_params = <class 'dict'>, original_params = {'symbol': '123456', 'type': 'limit', 'price': 123.4, 'amount': 23}

其中,json.dumps()这个函数,接受Python的基本数据类型,然后将其序列化为string,而 json.loads()这个函数,接受一个合法字符串,然后将其反序列化为Python的基本数据类型

是不是很简单呢?不过还是那句话,请记得加上错误处理。不然,哪怕只是给json.loads()发送了一个非法字符串,而没有catch到程序就会崩溃

那如果要输出字符串到文件,或者从文件中读取JSON字符串,又该怎么办呢?

是的,仍然可以使用上面提到的open()read()/write(),先将字符串读取/输出到内存,再进行JSON编码/解码,当然这有点麻烦

import jsonparams = {'symbol': '123456','type': 'limit','price': 123.4,'amount': 23
}with open('params.json', 'w') as fout:params_str = json.dump(params, fout)with open('params.json', 'r') as fin:original_params = json.load(fin)print('after json deserialization')
print('type of original_params = {}, original_params = {}'.format(type(original_params), original_params))########## 输出 ##########after json deserialization
type of original_params = <class 'dict'>, original_params = {'symbol': '123456', 'type': 'limit', 'price': 123.4, 'amount': 23}

简单清晰地实现了读写JSON字符串的过程

当开发一个第三方应用程序时,可以通过JSON将用户的个人配置输出到文件,方便下次程序启动时自动读取。这也是现在普遍运用的成熟做法

那么JSON是唯一的选择吗?显然不是,它只是轻量级应用中最方便的选择之一
在Google,有类似的工具叫做Protocol Buffer,Google已经完全开源了这个工具

相比于JSON,它的优点是生成优化后的二进制文件,因此性能更好。但与此同时,生成的二进制序列,是不能直接阅读的。它在TensorFlow等很多对性能有要求的系统中都有广泛的应用

四、总结

主要学习了Python的普通I/O和文件I/O,同时了解了JSON序列化的基本知识,并通过具体的例子进一步掌握。再次强调一下需要注意的几点:

  • I/O 操作需谨慎,一定要进行充分的错误处理,并细心编码,防止出现编码漏洞
  • 编码时,对内存占用和磁盘占用要有充分的估计,这样在出错时可以更容易找到原因
  • JSON 序列化是很方便的工具,要结合实战多多练习
  • 代码尽量简洁、清晰

【Python核心】输入与输出相关推荐

  1. python输入什么就输出什么意思_一文读懂Python的输入和输出

    本文介绍了Python的输入和输出,既然是Python代码,那么就一定有输出量,那么,Python是如何输出的呢? 输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'h ...

  2. python输入什么就输出什么_一文读懂Python的输入和输出

    本文介绍了Python的输入和输出,既然是Python代码,那么就一定有输出量,那么,Python是如何输出的呢? 输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'h ...

  3. python 3 输入和输出

    一.普遍的输入和输出 1.输入 在python3中,函数的输入格式为:input(),能够接受一个标准输入数据,返回string类型. input() 函数是从键盘作为字符串读取数据,不论是否使用引号 ...

  4. input只能输入两位小数_四十三、Python的输入与输出

    Python的输入与输出 一.输出格式美化 Python常见的有两种输出值的方式:表达式语句和print()函数.而第三种方式是使用文件对象的write()方法,标准输出文件可以用sys.stdout ...

  5. python文件输入和输出

    第一步 排除文件打开方式错误: r只读,r+读写,不创建 w新建只写,w+新建读写,二者都会将文件内容清零 (以w方式打开,不能读出.w+可读写) w+与r+区别: r+:可读可写,若文件不存在,报错 ...

  6. python如何输入和输出_输入和输出

    输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print('hello, world') p ...

  7. 小猿圈之python的输入和输出

    python是一门高级语言,学起来感觉很容易,但是真正想学好的还是得下点功夫的,小猿圈今天给大家说一下python中的输入和输出,在python 2 和python 3有什么区别,大家可一定要仔细学喽 ...

  8. Python基础---输入和输出

    一 python的运行方式: python的交互模式:可以直接输入代码,然后执行,并立刻输出结果.相当于启动了python的解释器,但是 等待你一行一行的输入代码,输入一行执行一行. python的命 ...

  9. <Python的输入、输出、注释>——《Python》

    目录 1.注释 1.1注释是什么 1.2注释的语法 (1) 注释行 (2) 文档字符串 1.3注释的规范 2.输入输出 2.1和用户交互 2.2通过控制台输出 2.3通过控制台输入 1.注释 1.1注 ...

  10. Python 基础--输入与输出

    有些时候你的程序会与用户产生交互.举个例子,你会希望获取用户的输入内容,并向用户打印出一些返回的结果.我们可以分别通过 input() 函数与 print 函数来实现这一需求. 对于输入,我们还可以使 ...

最新文章

  1. 超燃!Apache Flink 全球顶级盛会强势来袭[视频+PPT]
  2. python filter map区别_python中filter、map、reduce的区别
  3. 动态换ip如何实现_动态IP可以实现哪些功能及用途
  4. 【opencv】图像处理之相似变换、仿射变换、透视变换
  5. 设计导航网站|图片各种素材管够,资源丰富设计师懂得
  6. Fragment问题集
  7. java in list,Java 8流过滤:IN子句
  8. this.$router.push相关的vue-router的导航方法
  9. Android实战技巧:用TextView实现Rich Text---在同一个TextView中设置不同的字体风格...
  10. c#开发的一套完整的题库管理系统
  11. H3C官方培训课件大全
  12. 一款超漂亮的简历生成器,金三银四的你一定用得上
  13. 正则表达式-匹配中英文、字母和数字
  14. 如本科技上海分公司乔迁新址,加速长三角地区的业务覆盖
  15. 云产研见客户的行为分析
  16. 小米打印机显示服务器出错,关于小米笔记本连接不上网络打印机的处理方法!莫名其妙····...
  17. sql语句之字符串截取(substring_index)
  18. Android 一键锁屏 问题与解决
  19. 深度好文推荐:互联网厂商,究竟是如何看待5G的?
  20. vmwareplayer

热门文章

  1. AD中原理图和PCB的交互
  2. 入职P8几个月,一直没啥事,阿里花大价钱招我干嘛的?
  3. sencha touch font-face(自定义ico的另一种实现)的优劣(来至于sheng )
  4. 【收藏】2020年Python量化文章合辑
  5. UML之教学管理系统——6、Rational Rose画包图
  6. 如何将自己的文件进行加密?一个小程序的教你搞定
  7. 疫情加速IT人才外包服务普及应用~
  8. 计算机用户加密,计算机文件加密的几种方法
  9. 银行快消零售行业遏制数据泄露四驾马车
  10. 范文:项目开发总结报告