Python输入输出(IO)[通俗易懂]

Python输入输出(IO)[通俗易懂]程序会有输入和输出,输入可以从标准输入或是从一个文件读入数据,程序的输出可以以一种友好可读的方式(human-readable)打印出来,或是写进一个文件,而标准输入和标准输出(键盘和显示器)在程序的

大家好,又见面了,我是你们的朋友全栈君。

程序会有输入和输出,输入可以从标准输入或是从一个文件读入数据,程序的输出可以以一种友好可读的方式(human-readable)打印出来,或是写进一个文件,而标准输入和标准输出(键盘和显示器)在程序的角度也是文件,所以程序的输入输出就是文件读写。

 

1,内置函数print()

Python2.7中是有print语句和内置print函数的,而在Python3.3中,已经没有print语句了,只有print函数,而其实以前的print语句的功能就是print函数默认形式的功能,所以我们在这里就只看看Python3.3中的内置函数print()

函数原型

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

flush=False是Python3.3加上去的参数。

objects中每一个对象都会被转化为string的形式,然后写到file指定的文件中,默认是标准输出(sys.stdout),每一个对象之间用sep分隔,默认是空格;所有对象都写到文件后,会写入end,默认是换行。

一个例子,我们对sep和end作了修改

1 from __future__ import print_function   #Python2.7中使用print()函数,Python3.2中这行代码就不需要了 2 d = {1:'a', 2:'b'}
3 t = (4, 5, 6)
4 l = ['love', 'happiness']
5 print(d, t, l, sep='~', end='^_^\n')

我们已经知道d,t,l会被打包成一个tuple,赋给objects。如果对于print函数定义以及调用方式不熟悉,参见另一片博文[Python基础-函数

程序输出

{1: ‘a’, 2: ‘b’}~(4, 5, 6)~[‘love’, ‘happiness’]^_^

 

[注意] 以上代码用的Python2.7去解释运行,在Python2.7中,默认print会应用到print语句,如果想禁用print语句而使用print()内置函数,这必须从__future__中引入print_function,即第一行语句。

 

2,把object转化为str的形式,str()和repr()

在Python中,字符串(strings)是由置类str代表的,这是一个类。同时Python还有内置函数str()

输入输出都是以字符串的形式,print()就是把非str的object转化为其str的形式输出。那么Python怎么把一个object转化为str的形式呢,Python会把这个object传给内置str()函数

str()回去寻找这个对象的__str__()属性,如果这个对象没有__str__()属性,str()会调用repr()来得到结果。

 

一个例子,自定义的类,定义了__str__()函数

1 class wy:
2     def __str__(self):
3         return "abc"
4 
5 w = wy()
6 print(w)

 输出:abc

如果没有定义__str__(),则会调用repr(wy),会输出:

<__main__.wy2 instance at 0x7f900d0c8050>

 

3,文件输入输出

 使用内置函数open()得到一个文件对象(file object)。

open(filename, mode=’r’)  

mode可以有如下形式:’r’-读;’w’-写;’a’-从文件末尾追加(appending);’r+’ -读写;’w+’-读写(文件不存在时会创建);读写二进制(binary mode)文件时,加上’b’

文件对象的方法属性:

f.read(size)        返回最多size个字节的str,当size缺省或为负值时,整个文件内容都被作为一个str读出来,若到文末,返回空串’ ‘

f.readline()        返回文件中一行的str,末尾加上换行符’\n’

f.write(string)    将string写入file,返回成功写入的字符个数。

f.close()             文件对象使用完一定要close()掉

f.seek(offset, from_what)      改变文件对象的位置(position),offset为偏移量,from_what为参考位置,为0时从文件开头, 为1时使用当前的文件位置,为2是使用文件末尾位置。from_what默认为0 

按行从文件中读取,有一种简便的方式

1 f = open("print.py", "r+")
2 for line in f:             #line的结尾会自动有一个“\n"
3     print(line, end=" ")   #所以end=' ', 默认会又输出换行符

 

例子,把print.py中的内容读出来,写到一个新文件中,在打印出来。

1 f = open("print.py", "r")
2 f2 = open("wyfile", "w+") #使用w+文件不存在时候才会创建
3 for line in f:
4     f2.write(line)
5 f2.seek(0)       #这行语句之前,f2的位置在文末,所以必须调整到文件开头。
6 print(f2.read(), end=' ')
7 f.close() #记住要释放
8 f2.colse()

 

 

4,标准库pickle模块

我们已经知道输入输出都是字符串,要把一个对象存进文件,要将其转化为字符串;从文件中读出来的也是字符串,如果我们再要构建对象,则从读出来的字符串去做。

那如果我们并不在乎文件存储对象的形式,只想得到一个字符串去代表对象,用于存储,或用于网络传递,有没有更好的方法呢?

有的,这就是Python标准库的pickle模块。pickle模块提供了一套算法,用于对一个Python对象进行serializing(序列化为字符串)和de-serializing(从字符串构建对象),这个过程叫做pickle和unpickle。

pickle模块两个最常用的方法

pickle.dump(object, file)      将object序列化进file

pickle.load(file)                   从file中解出当前位置的下一个对象

一个例子,简单的试验和测试了一下pickle模块。

0 import pickle
1
d = {1:'a', 2:'b', 3:'c'} 2 f = open("newfile", "wb+") 3 pickle.dump(d, f) 4 del d[2] 5 pickle.dump(d, f) 6 f.seek(0) 7 d2 = pickle.load(f) #这里说明pickle可以区别出一个对象和另一个对象 8 d3 = pickle.load(f) 9 print(d2, d3)
close(f)

使用Python2.7运行,输出结果:

({1: ‘a’, 2: ‘b’, 3: ‘c’}, {1: ‘a’, 3: ‘c’})

那么文件”newfile”中是些什么内容呢,cat newfile得到如下东西

(dp0
I1
S’a’
p1
sI2
S’b’
p2
sI3
S’c’
p3
s.(dp0
I1
S’a’
p1
sI3
S’c’
p2

不太看得明白这是两个dict对象吧,可以看出,pickle确实使用了一些算法。

 

[题外]在写上面这个测试例子的时候,我开始运行的时候,始终报错,说pickle模块没有dump这个方法,后来google了一下,在stackoverflow上找到了答案,是我把文件名取为了pickle.py,所以根本没有import进标准的pickle模块,改了就好了,见参考3

 

 

参考:

1,http://docs.python.org/3.3/tutorial/inputoutput.html  Python文档

2,http://docs.python.org/3.2/library/pickle.html

3,http://stackoverflow.com/questions/3558718/how-do-i-pickle-an-object     Stackoverflow上问题

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156039.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月6日 上午9:46
下一篇 2022年7月6日 上午10:00


相关推荐

  • django和drf_类的序列化

    django和drf_类的序列化前言上一篇文章我们讲述了序列化,这篇就带大家一起来实现以下序列化Serializer我们使用序列化类Serializer,我们来看下源码结构,这里推荐使用pycharm左边导航栏的Structu

    2022年7月30日
    11
  • 深度学习模型压缩与优化加速(Model Compression and Acceleration Overview)

    深度学习模型压缩与优化加速(Model Compression and Acceleration Overview)1.简介深度学习(DeepLearning)因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩、优化加速、异构计算等方法突破瓶颈。模型压缩算法能够有效降低参数冗余,从而减少存储占用、通信带宽和计算复杂度,有助于深度学习的应用部署,具体可划分为如下几种方法(后续重点介绍剪枝与量化):线性或非线性量化:1/2bits,int8和fp16等; 结构或…

    2026年4月15日
    6
  • 执行游戏时出现0xc000007b错误的解决方法

    执行游戏时出现0xc000007b错误的解决方法

    2021年12月7日
    59
  • 飞机订票系统测试用例

    飞机订票系统测试用例1、登录界面的标题为“航班预订登录界面”;2、代理名称由4位或者以上的字母和数字组成,不超过8位,不能由纯数字组成或者数字开头,否则系统提示给出相应的提示“代理名称不能由纯数字组成,请重新输入”或“代理名称不能由数字开头,请重新输入”。代理名称长度小于4位时,点击确认按钮,系统弹出提示对话框提示“代理名称长度必须至少为4个字符,请重新输入”;代理名称长度大于8位时,点击确认按钮,系统弹出提

    2022年6月17日
    63
  • 简单完整讲述Servlet生命周期

    简单完整讲述Servlet生命周期servlet 生命周期过程 1 加载 web xml 文件 当前只去解析 xml 文件 知道 servlet 的存在 此时还没有去创建 servlet 声明 servlet servlet servlet 的别名 servlet name first servlet name servlet class com etime servlet FirstServlet servlet class servlet

    2026年3月19日
    2
  • Window Apply,Process Function,ReduceFunction,AggregateFunction分析

    Window Apply,Process Function,ReduceFunction,AggregateFunction分析本文全部来源于官方文档解释 WindowApply WindowedStre DataStream AllWindowedS DataStream Appliesagene Belowisafunc 解释 将一个通用的函数应用到整个窗口 可见 apply 用于窗口函数之后 举例

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号