Python之旅的第3²+1天(文件操作、迭代器、生成器)

今天计划看的一个关于昨天内容的博客最终还是没看,躺下的感觉总是那么爽,爽到你不想起床,但是早晨是例外的,因为精神可以控制肉体。

首先是关于文件操作的补充:

# 以字节形式读取文件:
# f = open(‘test.txt‘,‘rb‘)  #注意:如果以字节形式读取文件,此时是不能设置encoding =
# f.close()

# 关于换行,当你以readlines读取文件的时候会获得\r\n,但是Python会自动帮你转换为\n
# 通过在打开文件后面设置上newline
# f = open(‘test‘,‘r‘,encoding = ‘utf-8‘)
# print(f.readlines())   #输出结果:[‘第二行前面皮一下\n‘, ‘oujielun\n‘, ‘kobe\n‘, ‘第二行前面皮一下\n‘]
# f.close()
#
# f = open(‘test‘,‘r+‘,encoding = ‘utf-8‘,newline = ‘‘)
# print(f.readlines())   #输出结果:[‘第二行前面皮一下\r\n‘, ‘oujielun\r\n‘, ‘kobe\r\n‘, ‘第二行前面皮一下\r\n‘]
# f.close()
#在open打开文件的时候设置newline默认参数为空后,Python就不会再自动将\r\n转换为\n
#但是在使用seek方法的时候,计算字节数时,在Windows中依旧按照\r\n各自计算一个字节,即换行为两个字节

#字节形式文件写入方法
# f = open(‘test_1.txt‘,‘wb‘)    #字节形式写入不能设置encoding哦
# f.write(bytes(‘你好啊‘,encoding = ‘utf-8‘))  #这里在使用bytes方法输出‘你好啊’对应字节码时是需要注明参考编码表的
# f.close()

#字节形式读取文件的方式
# f = open(‘test_1.txt‘,‘rb‘)   #同理,字节形式读取也是不能在打开文件的时候设置encoding
# data = f.read()
# print(data)                  #输出结果:b‘\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a‘(‘你好啊‘的字节形式)
# print(data.decode(‘utf-8‘))  #输出结果:你好啊
# f.close()

#为什么会存在用字节形式读取文件的这种反人类操纵呢?
#我们处理的文件可不仅仅是字符串的形式哦,还有很多照片、视频等文件
#字节形式可以匹配一切设备,赞。

#文件操作的其他方法
#closed 检查文件是否关闭,有时候还是会忘记写f.close()
#f.encoding  显示文件打开所参考的编码(和文件存贮的编码形式无关哦)
#f.flust  刷新文件,相当于实现文件写入时定期的自动保存功能
#f.name  获取文件名称(目前感觉好傻逼的方法啊)

#f.tell 显示当前光标读取的所在位置(以字节形式反馈)
# f = open(‘test‘,‘r+‘,encoding = ‘utf-8‘)
# print(f.readline())     #输出结果:‘第二行前面皮一下‘,8个字用utf-8是24个字节,同时加上\r\n各占一个字节
# print(f.tell())     #输出结果为:26   3*8+2
# print(f.closed)     #输出Flase
# f.close()
#在文件中的所有读取方法中,只有read是按照字符数的个数进行移动光标,
# /其他所有方法都是按照字节进行移动光标

# f.seek 非常重要的一个方法,光标的移动
# 书写的格式为f.seek(a,b)   #按照字节数移动光标
# a表示光标移动的距离,b表示光标移动的方向
# 不输入参数b:默认为0,表示从文件最开始的位置移动a个字节
# b = 1 :表示从光标当前所在位置向后移动a个字节
# b = 2 :表示光标从文件最后向前移动a个字节,此时的a必须是一个负数

# seek的b值为默认的0时
# f = open(‘test‘,‘r‘,encoding = ‘utf-8‘)   #test文件内容
# [‘第二行前面皮一下\n‘, ‘oujielun\n‘, ‘kobe\n‘, ‘第二行前面皮一下\n‘]
# print(f.readline())   #输出结果:第二行前面皮一下
# f.seek(6)             #从文件开始向后移动6个字节
# print(f.readline())   #此时输出的内容:行前面皮一下
# f.close()

# seek的b值等于1时,移动光标的相对位置
# [‘第二行前面皮一下\n‘, ‘oujielun\n‘, ‘kobe\n‘, ‘第二行前面皮一下\n‘]
# f = open(‘test‘,‘rb‘)   #test文件内容,忘记了一个很重要的东西,要以字节的方式进行处理
# f.seek(6,1)             #从文件开始向后移动6个字节
# print((f.readline()).decode(‘utf-8‘))   #此时输出的内容:行前面皮一下
# f.seek(6,1)             #上一句的readline已经把光标移动到第二行的开端,现在从第二行开始向后移动6位
# print((f.readline()).decode(‘utf-8‘))   #此时输出的内容:‘un‘,此时是第二行开始向后移动了6个字节
# f.close()

# b = 2 时的操作,记住此时的a一定是负数
# f = open(‘test‘,‘rb‘)   #test文件内容
# # [‘第二行前面皮一下\n‘, ‘oujielun\n‘, ‘kobe\n‘, ‘第二行前面皮一下\n‘]
# f.seek(-6,2)             #从最后向前移动6个字节
# print((f.readline()).decode(‘utf-8‘))     #此时输出的内容:‘一下‘
# f.close()

# seek的b值等于2时,是文件操作中唯一从后向前读取文件的方法
# 可用于读取大规模文件的最后一行,比如大型网站的管理日志
# f=open(‘test_1.txt‘,‘rb‘)
#
# for i in f:
#     offs=-3
#     n=0
#     while True:
#         f.seek(offs,2)
#         data=f.readlines()
#         if len(data) > 1:
#             print(‘最后一行‘,data[-1].decode(‘utf-8‘))
#             break
#         offs*=2

# 加入没有seek方法,我们读取最后一行文件的方法
# f = open(‘test_1.txt‘,‘rb‘)
# data = f.readlines()    #这个创建list的过程会占用大量内存空间
# print(‘最后一行‘,data[-1].decode(‘utf-8‘))

关于迭代器:

  迭代器的概念:

#迭代器即迭代的工具,那什么是迭代呢?
#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
while True: #只是单纯地重复,因而不是迭代
    print(‘===>‘) 

l=[1,2,3]
count=0
while count < len(l): #迭代
    print(l[count])
    count+=1

  为何要有迭代器?什么是可迭代对象?什么是迭代器对象?

#1、为何要有迭代器?
对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器

#2、什么是可迭代对象?
可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下
‘hello‘.__iter__
(1,2,3).__iter__
[1,2,3].__iter__
{‘a‘:1}.__iter__
{‘a‘,‘b‘}.__iter__
open(‘a.txt‘).__iter__

#3、什么是迭代器对象?
可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象

文件类型是迭代器对象
open(‘a.txt‘).__iter__()
open(‘a.txt‘).__next__()

#4、注意:
迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象

  迭代器对象的使用

dic={‘a‘:1,‘b‘:2,‘c‘:3}
iter_dic=dic.__iter__() #得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身
iter_dic.__iter__() is iter_dic #True

print(iter_dic.__next__()) #等同于next(iter_dic)
print(iter_dic.__next__()) #等同于next(iter_dic)
print(iter_dic.__next__()) #等同于next(iter_dic)
# print(iter_dic.__next__()) #抛出异常StopIteration,或者说结束标志

#有了迭代器,我们就可以不依赖索引迭代取值了
iter_dic=dic.__iter__()
while 1:
    try:
        k=next(iter_dic)
        print(dic[k])
    except StopIteration:
        break

#这么写太丑陋了,需要我们自己捕捉异常,控制next,python这么牛逼,能不能帮我解决呢?能,请看for循环

  for循环

#基于for循环,我们可以完全不再依赖索引去取值了
dic={‘a‘:1,‘b‘:2,‘c‘:3}
for k in dic:
    print(dic[k])

#for循环的工作原理
#1:执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic
#2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码
#3: 重复过程2,直到捕捉到异常StopIteration,结束循环

  迭代器的优缺点

#优点:
  - 提供一种统一的、不依赖于索引的迭代方式
  - 惰性计算,节省内存
#缺点:
  - 无法获取长度(只有在next完毕才知道到底有几个值)
  - 一次性的,只能往后走,不能往前退

 关于生成器:

  什么是生成器

#只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码

def func():
    print(‘====>first‘)
    yield 1
    print(‘====>second‘)
    yield 2
    print(‘====>third‘)
    yield 3
    print(‘====>end‘)

g=func()
print(g) #<generator object func at 0x0000000002184360>

  生成器就是迭代器

g.__iter__
g.__next__
#2、所以生成器就是迭代器,因此可以这么取值
res=next(g)
print(res)

  三元表达式

#三元表达式
name = input(‘>>>‘)
if name == ‘alex‘:
    print(‘sb‘)
else:
    print(‘shuaige‘)

#以上if段落可简写为
print(‘sb‘) if name == ‘alex‘ else print(‘shuaige‘)

#貌似还有复杂写法,我得再看看

其实还是引用了很多现成的内容,暂时就是这么些了,很多需要复习哦

原文地址:https://www.cnblogs.com/xiaoyaotx/p/12406167.html

时间: 2024-10-08 13:19:47

Python之旅的第3²+1天(文件操作、迭代器、生成器)的相关文章

Python 列表生成式,函数,字符串,文件操作,生成器

知识点 1 ==与is区别:Python中对象包含的三个基本要素,分别是:id(身份标识).type(数据类型)和value(值). ==只比较值,而is比较身份标识也就是内存地址,而且在is比较中关于数据类型也就是只有数值型和字符串型的情况下,a is b才为True,当a和b是tuple,list,dict或set型时,a is b为False. 2 浅拷贝和深拷贝:需要使用copy模块 浅拷贝:copy()方法实现 1.对于不可变类型 Number String Tuple,浅复制仅仅是地

【Python之旅】第二篇(九):迭代器

说明:关于Python中迭代器的解释 Iterator是迭代器的意思,它的作用是一次产生一个数据项,直到没有为止.这样在 for 循环中就可以对它进行循环处理了.那么它与一般的序列类型(list, tuple等)有什么区别呢?它一次只返回一个数据项,占用更少的内存.但它需要记住当前的状态,以便返回下一数据项.它是一个有着next()方法的对象.而序列类型则保存了所有的数据项,它们的访问是通过索引进行的. 举个前面的例子来说就像readlines和xreadlines的区别,readlines是一

python基础:python循环、三元运算、字典、文件操作

目录: python循环 三元运算 字符串 字典 文件操作基础 一.python编程 在面向过程式编程语言的执行流程中包含: 顺序执行 选择执行 循环执行 if是条件判断语句:if的执行流程属于选择执行:if语句有三种格式,如下: 在多分支的if表达式中,即使多个条件同时为真,也只会执行一个,首先测试为真: 选择执行 单分支的if语句 if CONDITION: 条件为真分支 双分支的if语句 if CONDITION 条件为真分支 else 条件不满足时分支 多分支的if语句 if CONDI

Python全栈之路4--内置函数--文件操作

上节重点回顾: 判断对象是否属于某个类,例如: 列表中有个数字,但是循环列表判断长度,用len会报错;因为int不支持len,所以要先判断属于某个类,然后再进行if判断. # isinstance(对象,类名) 判断变量输入的对象是否是属于这个类 # 方法1: temp = [11, 22, "", " ", []] print(isinstance(temp, (str, list, tuple))) # 一旦对象属于这个后面元组的类中的任何一个 就返回true

python学习笔记(集合的使用、文件操作、字符编码与转码、函数)

集合 集合(set):把不同的元素组成一起形成集合,是python基本的数据类型. 集合元素(set elements):组成集合的成员 为什么需要集合? 集合的作用 1 .列表去重复数据 按照现有知识的解决思路:先设置空列表,然后使用for寻获,把需要去重的列表的第一个数据放到新列表中,然后依次取出第二个数据,把第二个数据和第一个数据作比较,如果不一样,则存入新列表中:以此类推,每取一次都要和新列表中的数据作对比,不一样的则添加入新列表中. 2. 关系测试 比如有学员同时报了python班和l

Python学习笔记(第三天,文件操作、函数)

一.文件处理 1.文件打开模式 打开文本的模式,默认添加t,需根据写入或读取编码情况添加encoding参数. r   只读模式,默认模式,文件必须存在,不能存在则报异常. w  只写模式,若文件不存在则创建,若文件已存在则清空内容,不可以读文件. a   追加模式,文件不存在则创建,若文件已存在则在文件末尾追加,不可以读文件.    打开非文本的模式,使用"b"表示读取和写入需使用字节,不可指定编码.主要有rb.wb.ab三种模式. 2.操作文件方法 读取文件 with open('

python系统学习:第三周之文件操作

# ***********第一部分***********# 1.读文件,首先利用一个变量承装文件 最主要注意的是encoding的问题,看看是否是格式问题f = open(file='D:\study\少妇白洁.txt', mode='r', encoding='GBK') # file等关键字可以直接省略 mode 指模式# 对变量使用方法read进行读取data = f.read()# 输出print(data)# 关闭f.close()# ***********第二部分**********

8.6(数据类型分类,python深浅拷贝,异常处理,基本的文件操作,绝对路径和相对路径)

数据类型分类 按照存值个数: 存一个值:整型/浮点型/字符串 存多个值:列表/字典/元组/集合 按照有序和无序: 有序:字符串/列表/元组 无序:字典/集合 按照可变和不可变 可变:字典/列表/集合 不可变:整型/浮点型/字符串/元组 Python深浅拷贝 # 拷贝 赋值 # lt = [1,2,3] # lt2 = lt # lt.append(4) # print(lt) # print(lt2) # 列表为可变类型,所以lt的值变化,lt2的值也会跟着变化 # 浅拷贝 # import..

Python开发【第XXX篇】 基本文件操作----和永久存储

##open将操作系统发起请求,操作系统完成请求, # f = open('old.txt','r',encoding = 'utf-8') # res = f.read() # print(res) # f.close() # f = open('old.txt','r',encoding = 'utf-8') # res = f.readline()##读取一行 # print(res) # f.close() ##读完文件之后必须要关闭,否则文件将一直保存在操作系统中 ##执行以下操作可以

开始 Python 之旅

开始 Python 之旅 课程来源 本课程基于 Python for you and me 教程翻译制作,其中参考了 Python tutorial 和 The Python Standard Library,并对原教程的内容进行了改进与补充. 相关链接地址如下: Python tutorial:http://www.pythondoc.com/pythontutorial3/index.html Python for you and me:http://pymbook.readthedocs.