Python(九)

IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。

通常程序完成IO操作会有Input和Output两个数据流:

访问网页时浏览器首先会向外发送数据给所访问网页的服务器,获取该网页首页的HTML,该过程即为输出Output;随后网页服务器将网页发过来,该过程是从外面接收数据,叫输入Input

从磁盘读取文件到内存,就只有Input操作,反过来,把数据写到磁盘文件里,就只是一个Output操作。

IO编程中,Stream(流)是一个很重要的概念,想象成一个水管数据就是水管里的水,但是只能单向流动

对于浏览网页来说,浏览器和新浪服务器之间至少需要建立两根水管,才可以既能发数据,又能收数据。

  • IO编程中,存在速度严重不匹配:CPU和内存的速度>>>>外设的速度

如:把100M的数据写入磁盘,TCPU输出100M数据 = 0.01s,T磁盘接收100M数据 = 10s

解决办法:①同步IO:CPU等着,即程序暂停执行后续代码,等100M的数据在10秒后写入磁盘,再接着往下执行。【逛商场前买奶茶需5min,选择柜台前干等5min】

异步IO:一边是CPU立刻接着执行后续代码,一边是磁盘慢慢写入数据。【逛商场前买奶茶需5min,你选择先去逛一逛】

同步和异步的区别就在于是否等待IO执行的结果。

使用异步IO来编写程序性能会远远高于同步IO,但是异步IO的缺点是编程模型复杂。

操作IO的能力都是由操作系统提供的,每一种编程语言都会把操作系统提供的低级C接口封装起来方便使用,Python也不例外。

File对象的属性

一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息。

以下是和file对象相关的所有属性的列表:

属性描述
file.closed返回true如果文件已被关闭,否则返回false。
file.mode返回被打开文件的访问模式。
file.name返回文件的名称。
file.softspace如果用print输出后,必须跟一个空格符,则返回false。否则返回true。
# 打开一个文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
print "是否已关闭 : ", fo.closed
print "访问模式 : ", fo.mode
print "末尾是否强制加空格 : ", fo.softspace

以上实例输出结果: 
文件名:  foo.txt
是否已关闭 :  False
访问模式 :  w
末尾是否强制加空格 :  0

文件读写

文件:存储在外部介质(如:磁盘)上的数据或信息的集合

文本文件:一般指只要字符编码存储的文件,能够被最简单的文本编辑器直接读取

在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。

  • 文件的操作步骤:打开文件 → 操作文件(读、写等)→ 关闭文件。

①打开文件:file object = open(file_name [, access_mode [,encoding = None [, errors = None] ] ])   

file_name:文件名(包括路径);

access_modeaccess_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)

encoding = None    默认读取UTF-8编码的文件。如果要读取非UTF-8编码的文本文件,就需要传入encoding参数。

errors = None    errors的取值一般有strictignore,当取strict的时候,字符编码出现问题的时候,会报错,当取ignore的时候,编码出现问题,程序会忽略而过,继续执行下面的程序。

打开模式含义
r(默认)只读方式打开。文件的指针将会放在文件的开头,文件不存在则报错IOError
w只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。即,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb+二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片、视频等。
#读取GBK编码的文件
>>> f = open('/Users/Tony/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'

如果文件不存在,open()函数就会抛出一个IOError的错误。

②操作文件——读read()& readline() & readlines()

fileObject.read(size)    返回从字符串中读取的字节,如果未给定size或给负值则读取所有。

#假设有一个python.txt文件,文件内容为:i love python!


# 打开一个文件,用于读写
fo = open("python.txt", "r+")
#读取python.txt文件里的前10个字符
str = fo.read(10)
print "读取的字符串是 : ", str
# 关闭打开的文件
fo.close()

以上实例输出的结果为:i love pyt

 调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便。

for line in f.readlines():
    print(line.strip()) # 把末尾的'\n'删掉

str.strip(chars)    用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。

chars——需移除的位于首尾的字符系列】

注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。

 

②操作文件——写write()& writelines()

fileObject.write(str)    用于向文件中写入指定字符串,Python字符串可以是二进制数据,而不是仅仅是文字。

如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not 'str'。

fileObject.write(str)    用于向文件中写入字符串列表。可以是由迭代对象产生的。换行需要制定换行符 \n

 

#write( )  str
>>> f=open(r'D:\python36\projects\text.txt','w')        #这里说明该文件是用来写入的	  
>>> words="争分夺秒\n"	                                              #自己添加'\n'
>>> f.write(words)	                                     #write(str)的参数是str  
5                                                                #返回写入字符的个数
>>> f.close()	                          #写入文件后f.close(),文件才真正写入上面字符
>>> open(r'D:\python36\projects\text.txt','r').read()
'争分夺秒\n'
>>> print(open(r'D:\python36\projects\text.txt','r').read())
争分夺秒                                      #该文件内只有一个词争分夺秒。

#writelines( )  list
>>> f=open(r'D:\python36\projects\text.txt','w')        #这里说明该文件是用来写入的	  
>>> words=["争分夺秒\n","力争上游\n"]                         #自己添加'\n'
>>> f.writelines(words)	                               #writelines([list])无返回值  
>>> f.close()	                          #写入文件后f.close(),文件才真正写入上面字符
>>> open(r'D:\python36\projects\text.txt','r').read()
'争分夺秒\n,力争上游\n'
>>> print(open(r'D:\python36\projects\text.txt','r').read())
争分夺秒
力争上游                                    

 ③关闭文件——close()

文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。

fileObject.close()    用于关闭一个已打开的文件。

关闭后的文件不能再进行读写操作, 否则会触发 ValueError 错误。 close() 方法允许调用多次。

当 file 对象,被引用到操作另外一个文件时,Python 会自动关闭之前的 file 对象。

  • 在Python中,文件读写是通过open()函数打开的文件对象完成的。使用with语句操作文件IO是个好习惯。

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现或者引入with语句来自动帮我们调用close()方法

try:
    f = open('/path/to/file', 'r')
    print(f.read())
finally:
    if f:
        f.close()

#每次写入try ... finally过于繁琐,可使用with,且不比调用f.close():
with open('/path/to/file', 'r') as f:
    print(f.read())

 

 

### Python大核心概念或技术 以下是Python中常见的大核心概念和技术: #### 1. 面向对象编程 (OOP) Python 是一种支持面向对象编程的语言,允许开发者通过类和实例化对象的方式构建复杂的应用程序。它强调封装、继承和多态的概念[^1]。 #### 2. 并发编程模型 并发编程是现代应用程序开发的重要组成部分。Python 提供了多种实现并发的方法,包括线程、进程以及异步 I/O 等方式。这些方法帮助开发者更高效地利用 CPU 和 IO 资源[^2]。 #### 3. 字典数据结构 字典(`dict`)是 Python 中非常重要的内置数据类型之一,用于存储键值对。可以通过 `dict()` 函数或者花括号 `{}` 来创建字典。例如,可以使用列表嵌套元组的方式来初始化字典[^3]: ```python my_dict = dict([("key1", "value1"), ("key2", "value2")]) print(my_dict) # 输出 {'key1': 'value1', 'key2': 'value2'} ``` #### 4. 列表推导式 列表推导式是一种简洁而强大的工具,能够快速生成新的列表。它的基本形式如下所示: ```python squares = [x ** 2 for x in range(10)] print(squares) # 输出 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] ``` #### 5. Lambda 表达式 Lambda 表达式提供了一种简便的方法定义匿名函数。它们通常与其他高阶函数一起使用,比如 `map()`, `filter()`, 或者 `reduce()`。 ```python double = lambda x: x * 2 result = double(5) print(result) # 输出 10 ``` #### 6. 迭代器与生成器 迭代器是一个实现了特殊协议的对象,该协议规定了如何访问集合中的每一个元素而不暴露底层表示。生成器则是创建迭代器的一种简单方法,只需在一个普通的函数内部使用 yield 关键字即可返回一系列的结果。 ```python def simple_generator(): yield 1 yield 2 gen = simple_generator() for value in gen: print(value) # 输出 1\n2 ``` #### 7. 异常处理机制 异常处理使得程序能够在遇到错误的情况下优雅退出而不是崩溃。这主要依赖于 try-except 结构来捕获并响应特定类型的错误条件。 ```python try: result = 1 / 0 except ZeroDivisionError as e: print(f"Caught an exception: {e}") ``` #### 8. 模块与包管理 模块是指包含一组相关功能的文件;当多个模块被组合在一起时就形成了包。这种组织方式有助于保持大型项目的清晰度和可维护性。标准库提供了大量的预置模块以满足不同需求。 #### 9. 装饰器模式 装饰器本质上是用来修改其他函数行为的一个高级特性。它可以动态增加额外的功能到现有代码上而无需改变其原始逻辑。 ```python def my_decorator(func): def wrapper(): print("Something is happening before the function is called.") func() print("Something is happening after the function is called.") return wrapper @my_decorator def say_hello(): print("Hello!") say_hello() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值