Python with语句和过程抽取思想

with语句的应用场景

  编程中有很多操作都是配套使用的,这种配套的流程可以称为计算过程,Python语言为这种计算过程专门设计了一种结构:with语句。比如文件处理就是这类计算过程的典型代表。

 

使用with语句前后对比

没有使用with语句之前,我们是这样打开一个文件的:

try:
    # 1. [进入]
    f = open('a.txt', 'r', encoding="utf-8")
    # 2. [执行]
    print(f.read())
finally:
    if f:
        # 3. [退出]
        f.close()

python操作文件的流程一般就是这三步:

  1. [进入]用只读方式打开文件
    如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在
  2. [执行]读取文件内容
    如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示
  3. [退出]关闭打开的文件
    文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

思考为什么关闭文件操作一定要放在finallly语句里?
  由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现。

发现共性:
我们发现其实这种过程化的语句有共性,比如说在进去一个片段必须做某种超赞,处理工作又需要执行一个结束操作。比如上面的这段代码:

上面的代码块就可以做一个封装。

使用with语句后,我们是这样打开一个文件的:

这个with语句和前面的try ... finally结构是一样的,但是代码更佳简洁,并且不必调用f.close()方法。

 

with语句的执行原理

从解释器的角度去理解with语句执行流程。

with语句的基本形式是:

  这样的一段代码可以称为一个上下文(context),在执行with语句时,解释器会先求出表达式的值,这个值(对象)是一个上下文管理器,并且假设这个对象拥有如下类的构造方法:

with语句在求出这个上下文管理器对象之后,自动执行进入方法,并将这个对象的返回值赋值于 as 之后的变量,然后执行语句块。然后在退出上下文前,自动执行对象的退出方法

python系统和标准库的一些类型定义了这对操作,可以直接用于with语句。比如文件对象就直接支持这一对操作,因此可以用在with语句的头部。

如果你也有类似的计算过程需要抽取出来,那么可以自定义一个类,并且包含进入、退出方法。

自定义open函数

自己实现才发现,使用装饰器和生成器就能很好的解决这个问题,不需要用到类构造方法来实现;

开始 hello,我是a.txt的第1行文字。 结束

 

总结

打开文件读写、用pickle包完成数据的存储、恢复的操作,都非常适合使用with语句。

我总结了一下使用with语句的优点:

  1. 采用with语句的代码更简洁;

  2. 防止因为忘记写f.close()而引发的错误;

  3. 一个对象(上下文)的操作有进入、退出过程就可以抽取出来,并做成自动化执行;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python中的内置函数open来读取文件。下面是一个读取文件内容的示例代码: ```python def read_file(file_path): try: with open(file_path, 'r', encoding='utf-8') as file: content = file.read() return content except FileNotFoundError: print('文件不存在') return None file_path = 'example.txt' # 文件路径 content = read_file(file_path) if content: print(content) ``` 上述代码中,read_file函数接收一个文件路径作为参数,然后使用with语句打开文件,并使用read方法读取文件内容。最后将内容返回。 实体抽取是指从文本中提取出特定类型的实体,例如人名、地名、组织机构名等。在Python中可以使用第三方库如NLTK、spaCy等进行实体抽取。以下是使用NLTK库进行人名实体抽取的示例代码: ```python import nltk def extract_person_names(text): sentences = nltk.sent_tokenize(text) # 将文本分割成句子 tokenized_sentences = [nltk.word_tokenize(sentence) for sentence in sentences] # 对句子进行分词 tagged_sentences = [nltk.pos_tag(sentence) for sentence in tokenized_sentences] # 对分词后的句子进行词性标注 person_names = [] for tagged_sentence in tagged_sentences: for chunk in nltk.ne_chunk(tagged_sentence): # 使用命名实体识别 if hasattr(chunk, 'label') and chunk.label() == 'PERSON': # 过滤出人名实体 person_names.append(' '.join(c[0] for c in chunk.leaves())) return person_names text = 'John and Lisa are good friends. They work at Google.' person_names = extract_person_names(text) print(person_names) ``` 上述代码中,extract_person_names函数接收一个文本作为参数,首先将文本分割成句子,然后对每个句子进行分词和词性标注,接着使用命名实体识别来抽取人名实体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值