Python核心技术与实战——四|Python黑箱:输入与输出
抽象的看,Python程序可以被看成一个黑箱:通过输入流将数据送达,经过处理后在输入,也就是说具备了一个图灵机运作的必要条件。
输入输出基础
最简单的输入是来自键盘的操作
name = input('please input your name:')
print('welcome {}!'.format(name))
程序运行到input处会暂停运行,同时等待键盘的输入直到回车被按下。函数的参数就是提示语,输入的数据类型永远都是字符串型。这里就要注意在使用时的容错处理
name = input('please input your name:')
age = input('please input your age:')
age = int(age)
print('welcome {}!'.format(name))
在这里由于进行了一个强制转换,如果输入的数据不是数字类型的字符串的话程序就会报错
please input your name:aa
please input your age:a
Traceback (most recent call last):
File "D:/python/PyQt_GUI/QDialog/color.py", line 140, in <module>
age = int(age)
ValueError: invalid literal for int() with base 10: 'a'
所以在使用时一定要注意到这种情况,加上try except。
try :
age = int(age)
except ValueError as e:
print('age should be int')
还有一个要注意的点:Python对int类型是没有最大限制的(相对C++来说int最大值为2147483647,超出会产生数据溢出)。
文件输入输出
命令行的输入输出只是提供了Python交互的最基本的方式,而生产级的I/O大部分来自文件、网络或其他进程的消息。下面我们就详细的分析一个文本文件的读写,假设有个文本文件in.txt,内容是下面的
I have a dream that my four little children will one day live in a nation where not bejudged by the color of their skin but 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 girls will be able to join hands with little white boys and girls as sisters and brothers.I have a dream today. I have a dream thatone dya 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,l 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 evety 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 man, Jews and Gentiles, Protestants and Catholics, will be anle 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
然后我们来看一看下面的代码
import re
def parse(text):
#除去标点和换行符
text = re.sub(r'[^\w]',' ',text)
#转换为小写
text = text.lower()
word_list = text.split(' ')
#统计词频
word_cnt = {}
for word in word_list:
if len(word)!=0:
if word in word_cnt:
word_cnt[word]+=1
else:
word_cnt[word] = 1
#字典重新排序
replace_word = sorted(word_cnt.items(),key=lambda kv:kv[1],reverse=True)
return replace_word with open('in.txt','r') as f:
text = f.read()
word_freq = parse(text) with open('out.txt','w') as f:
for word,freq in word_freq:
f.write("{}:{}\n".format(word,freq))
我们先用open()函数拿到文件的指针,然后通过read()函数读取文件的内容到内存中,并赋值给变量text。然后调用parse函数进行分析。这种方式的优点是方便,可以直接在内存中进行分析,当然缺点是如果文件过大,一次性读取就可能造成内存崩溃。
这时候我们可以给read()指定个size,用来表示每次读取的最大长度,或者用readline()函数每次只读取一行。这种做法常用于数据挖掘(Data Mining)中的数据清洗。如果每行之间没有关系也可以降低内存的压力。(在Python之ftp服务器中put或get文件时就是用的这种方法)。但是在上面NLP的案例中由于存在单词被截断的问题,是不能用的。这留下作为一个思考题后面再讲。
在打开文件的时候用的是with语句。因为open()函数对应了close()函数,也就是说打开文件完成读取任务后应该立刻关掉它。而如果使用了with语句就不需要显示的调用close()。在with的段落下任务执行完毕后close()会自动被调用,代码也简洁的多。
这里要插播两点要注意的地方:
1.在用open()函数时一定要注意权限的设定,如果是读取权限就不要请求权限,可以试一下把权限改成
with open('in.txt','w+') as f:
text = f.read()
word_freq = parse(text)
执行前一定要注意备份in.txt文件!执行前一定要注意备份in.txt文件!执行前一定要注意备份in.txt文件!
执行的以后可以发现原文件成空的了~只能准备跑路了!
2.在进行文件I/O的时候要记得进行异常处理。因为I/O操作可能会由各种各样的情况出现,而一个健壮(robust)的程序应该能应对各种情况的发生而不会崩溃。
三.JSON序列化
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,他的设计意图是把所有的事情都用字符串来表示,作为两种不同语言之间的”黑箱“
1.把各种杂七杂八的信息序列化,输出一个字符串
2.输入一个字符串,输出一个包含原始信息的字典。
Python的Json序列化里讲了Json的基本使用方法,这里就不再多说了!不过还是那句话,记得加上异常处理,不然即便是给json.loads()发送了一个非法字符串程序就会崩溃了!
除了JSON序列化,还有多种选择Google开源了它的类似的工具(Protocol Buffer),可以了解一下!相比于JSON,他的有点是生成优化后的二进制序列。在TensorFlow等对性能有要求的系统中有广泛的应用。
四.思考题
1.考虑一下上面一节说的在对比较大的文件进行I/O时怎么分段读取而不破坏单词的完整性。
2.加试题:我们把家里一个100G的数据通过网盘传递给公司的电脑,每次从家里的电脑通过server.py向网盘写5G的数据,公司的client.py一旦侦测到有新的数据就get文件到本地,完成操作后删除网盘上的数据,家里的电脑检测到数据成功被get后重新put下一个文件。
Python核心技术与实战——四|Python黑箱:输入与输出的更多相关文章
- Python核心技术与实战——十七|Python并发编程之Futures
不论是哪一种语言,并发编程都是一项非常重要的技巧.比如我们上一章用的爬虫,就被广泛用在工业的各个领域.我们每天在各个网站.App上获取的新闻信息,很大一部分都是通过并发编程版本的爬虫获得的. 正确并合 ...
- Python核心技术与实战——十三|Python中参数传递机制
我们在前面的章节里学习了Python的函数基础以及应用,那么现在想一想:传参,也就是把一些参数从一个函数传递到另一个函数,从而使其执行相应的任务,这个过程的底层是如何工作的,原理又是怎样的呢? 在实际 ...
- Python核心技术与实战——六|异常处理
和其他语言一样,Python中的异常处理是很重要的机制和代码规范. 一.错误与异常 通常来说程序中的错误分为两种,一种是语法错误,另一种是异常.首先要了解错误和异常的区别和联系. 语法错误比较容易理解 ...
- Python核心技术与实战 笔记
基础篇 Jupyter Notebook 优点 整合所有的资源 交互性编程体验 零成本重现结果 实践站点 Jupyter 官方 Google Research 提供的 Colab 环境 安装 运行 列 ...
- Python核心技术与实战——十九|一起看看Python全局解释器锁GIL
我们在前面的几节课里讲了Python的并发编程的特性,也了解了多线程编程.事实上,Python的多线程有一个非常重要的话题——GIL(Global Interpreter Lock).我们今天就来讲一 ...
- Python核心技术与实战——九|面向对象
在搞清了各种数据类型.赋值判断.循环以后如果是从C++.Java语言入手的,就会有一个深坑要过:OOP(object oriented programming):公私有保护.多重继承.多态派生.纯函数 ...
- Python核心技术与实战——十一|程序的模块化
我们现在已经总结了Python的基本招式和套路,现在可以写一些不那么简单的系统性工程或代码量较大的应用程序.这时候,一个简单的.py文件就会显得过于臃肿,无法承担一个重量级软件开发的重任.这就需要这一 ...
- Python 基础【第三篇】输入和输出
这里我们创建一个python(pytest)脚本用于学习测试(以后都为这个文件,不多做解释喽),这个文件必须要有执行权限的哈 1.创建pytest并赋予执行权限 [root@fengyuba_serv ...
- Python核心技术与实战——十四|Python中装饰器的使用
我在以前的帖子里讲了装饰器的用法,这里我们来具体讲一讲Python中的装饰器,这里,我们从前面讲的函数,闭包为切入点,引出装饰器的概念.表达和基本使用方法.其次,我们结合一些实际工程中的例子,以便能再 ...
随机推荐
- hook工具
调试工具 WinDbg com/daoyuly/p/3570037 DebugDiag procexp64.exe APIMonitor OllyDBG API伴侣 FileMon v7.04 ( ...
- 十四、RF中SSHLibrary库介绍
A.安装SSHLibrary: pip2 install robotframework-sshlibrary (导入SSHLibrary) B.远程连接linux服务器 1.#连接linux服 ...
- Linux_ServicesManagement_RHEL7
目录 目录 Network Manager RHEL7的服务管理systemctl指令 服务的启动停止重载重启 服务的分类 指令选项 Network Manager 注意:network servic ...
- Jmeter接口测试系列之保存断言结果到文件
在执行完接口测试用例后,我们需要将失败的用例结果统一保存到文件中,可以使用“断言结果”组件,并定制输出内容. 1.配置断言结果组件输出 (1.在文件名中配置需要保存的文件路径和文件名: (2.勾选仅日 ...
- N个小时学SAP ABAP
接触SAP已将近3年了,期间ABAP资料也看了不少,都是东看一点.西看一点的,也没做个笔记之类的,很明显效果不是很好.今天突然间领悟到了一点:不能再这样漫无目的的学习了,应该一本书一本书的看,否则就太 ...
- 整理一下go的ci工具
代码格式化 go fmt fileName.go goimports 自动格式化import goimports -w fileName.go mod 自动更新/删除包 go mod tidy 检查注 ...
- Nginx 配置文件 nginx.conf 详解
Nginx的配置文件nginx.conf配置详解如下: user nginx nginx; #Nginx用户及组:用户 组.window下不指定 worker_processes 8; #工作进程:数 ...
- python+ selenium&APPium自动化 page Object 设计模式
题记: 之前公司项目比较稳定, 在进行了系统测试,想用自动化测试进行冒烟测试,或者对主要功能进行测试, 因此用到了PO模式 因此做个记录: Page Object Page Object模式是使用Se ...
- 修改jupyter notebook默认路径,亲测
anaconda环境 任务栏中找到anaconda/jupyter notebook,鼠标右键属性 点击确认即可.
- 操作系统安全 - 提权 - Windows提权 - 汇总
CVE_2019-1388 Date: -- 影响范围: SERVER ====== Windows 2008r2 ** link OPENED AS SYSTEM ** Windows 2012r2 ...