抽象的看,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黑箱:输入与输出的更多相关文章

  1. Python核心技术与实战——十七|Python并发编程之Futures

    不论是哪一种语言,并发编程都是一项非常重要的技巧.比如我们上一章用的爬虫,就被广泛用在工业的各个领域.我们每天在各个网站.App上获取的新闻信息,很大一部分都是通过并发编程版本的爬虫获得的. 正确并合 ...

  2. Python核心技术与实战——十三|Python中参数传递机制

    我们在前面的章节里学习了Python的函数基础以及应用,那么现在想一想:传参,也就是把一些参数从一个函数传递到另一个函数,从而使其执行相应的任务,这个过程的底层是如何工作的,原理又是怎样的呢? 在实际 ...

  3. Python核心技术与实战——六|异常处理

    和其他语言一样,Python中的异常处理是很重要的机制和代码规范. 一.错误与异常 通常来说程序中的错误分为两种,一种是语法错误,另一种是异常.首先要了解错误和异常的区别和联系. 语法错误比较容易理解 ...

  4. Python核心技术与实战 笔记

    基础篇 Jupyter Notebook 优点 整合所有的资源 交互性编程体验 零成本重现结果 实践站点 Jupyter 官方 Google Research 提供的 Colab 环境 安装 运行 列 ...

  5. Python核心技术与实战——十九|一起看看Python全局解释器锁GIL

    我们在前面的几节课里讲了Python的并发编程的特性,也了解了多线程编程.事实上,Python的多线程有一个非常重要的话题——GIL(Global Interpreter Lock).我们今天就来讲一 ...

  6. Python核心技术与实战——九|面向对象

    在搞清了各种数据类型.赋值判断.循环以后如果是从C++.Java语言入手的,就会有一个深坑要过:OOP(object oriented programming):公私有保护.多重继承.多态派生.纯函数 ...

  7. Python核心技术与实战——十一|程序的模块化

    我们现在已经总结了Python的基本招式和套路,现在可以写一些不那么简单的系统性工程或代码量较大的应用程序.这时候,一个简单的.py文件就会显得过于臃肿,无法承担一个重量级软件开发的重任.这就需要这一 ...

  8. Python 基础【第三篇】输入和输出

    这里我们创建一个python(pytest)脚本用于学习测试(以后都为这个文件,不多做解释喽),这个文件必须要有执行权限的哈 1.创建pytest并赋予执行权限 [root@fengyuba_serv ...

  9. Python核心技术与实战——十四|Python中装饰器的使用

    我在以前的帖子里讲了装饰器的用法,这里我们来具体讲一讲Python中的装饰器,这里,我们从前面讲的函数,闭包为切入点,引出装饰器的概念.表达和基本使用方法.其次,我们结合一些实际工程中的例子,以便能再 ...

随机推荐

  1. iOS AES-CBC、AES-ECB 加解密

    简介 AES是加密的算法,使用128.192 和 256 位密钥,将被加密数据划分为128位(16字节)一块,然后使用某种加密模式进行加密 关键词: 块大小:16字节 密钥长度:AES算法下,key的 ...

  2. AAAI 2018 分析

    AAAI 2018 分析 word embedding Learning Sentiment-Specific Word Embedding via Global Sentiment Represen ...

  3. vivo 部分链表反转

    方法一:使用栈交换需要反转的数字 #include <iostream> #include <stack> #include "list.h" using ...

  4. Openstack_通用模块_Oslo_vmware 创建 vSS PortGroup

    目录 目录 vSS vSSPG vSphere SDK 中相关的网络对象 创建 vSS PortGroup vSS & vSSPG vSS(Standard vSwitch 标准交换机) 为在 ...

  5. 使用C#分层查询多个表数据

    下面我来给大家叙述一下视野分层加载多张表数据: 首先创建一个StudentExtends类: 在DAL层studentDAL类写如下代码: 在BLL层写如下代码,引用DAL层的LoadStudentI ...

  6. 【工具安装】MAC 安装 netdiscover 使用教程

    日期:2019-06-27 15:54:19 作者:Bay0net 介绍:在 mac os 下,如何安装 netdiscover 及基本使用方法 0x01.当前环境 MAC os 10.14.4 已安 ...

  7. ES6中数组和对象的扩展运算符拷贝问题以及常用的深浅拷贝方法

    在ES6中新增了扩展运算符可以对数组和对象进行操作.有时候会遇到数组和对象的拷贝,可能会用到扩展运算符.那么这个扩展运算符到底是深拷贝还是浅拷贝呢? 一..使用扩展运算符拷贝 首先是下面的代码. le ...

  8. 一文学会Go - 2 数据结构与算法实践篇

    练习:使用go语言实现冒泡排序和归并排序 冒泡排序是所有排序算法中最简单的,练习时先实现它: func bubbleSort(array []int) { n := len(array) ; j &l ...

  9. MySQL知识集合

    1.Mysql体系架构     2.MySQL文件结构 (1)参数文件:启动MySQL实例的时候,指定一些初始化参数,比如缓冲池大小.数据库文件路径.用户名密码等         -my.cnf读取优 ...

  10. Android - Unable to add window android.view.ViewRootImpl$W@6518342 -- permission denied for window type 2133

    因为跟博主碰到了一样的问题,所以记录一下分析原理 原文链接:https://www.jianshu.com/p/b0364074288a 首先,先介绍下背景环境,第一,是Android7.0,其次,要 ...