首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有跨多行前缀的读取文件

具有跨多行前缀的读取文件
EN

Stack Overflow用户
提问于 2021-01-19 12:35:11
回答 2查看 101关注 0票数 0

你好,我想清理一个文本文件,其中包含一个记录。

我复印并粘贴了一小部分:

代码语言:javascript
运行
复制
*CHI:   and when he went to sleep one night , somehow the frog escaped from
    the jar while he was sleeping .
%mor:   coord|and conj|when pro:sub|he v|go&PAST prep|to n|sleep
    pro:indef|one n|night cm|cm adv|somehow det:art|the n|frog
    v|escape-PAST prep|from det:art|the n|jar conj|while pro:sub|he
    aux|be&PAST&13S part|sleep-PRESP .
%gra:   1|4|LINK 2|4|LINK 3|4|SUBJ 4|0|ROOT 5|4|JCT 6|5|POBJ 7|13|LINK
    8|13|SUBJ 9|8|LP 10|13|JCT 11|12|DET 12|13|SUBJ 13|6|CMOD 14|13|JCT 15|16|DET
    16|14|POBJ 17|20|LINK 18|20|SUBJ 19|20|AUX 20|13|CJCT 21|4|PUNCT
*INV:   0 [=! gasps] .
*CHI:   when the boy woke up he noticed that the frog had disappeared .
%mor:   conj|when det:art|the n|boy v|wake&PAST adv|up pro:sub|he
    v|notice-PAST pro:rel|that det:art|the n|frog aux|have&PAST
    dis#part|appear-PASTP .

基本上,我只想读前缀*CHI:但是阅读他们说过的所有行,这是我的代码。

代码语言:javascript
运行
复制
def read_file(name):
    file = open(name,"r",encoding = "UTF-8")

    content = file.readlines()

    file.close()

    return content


def extract_file(text):
    clean = []
    for line in text:
        if line.startswith("*CHI:"):
            line = line.replace('\t','')
            clean.append(line)
    return clean

但这只会读取带有前缀的行,但不会一直读到末尾。它会在\n之后停止

所以,当我运行这个,我会得到

一天晚上,当他睡着时,青蛙不知何故逃离了\n,而不是

一天晚上,当他睡着的时候,不知何故,青蛙在睡觉的时候从罐子里逃了出来。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-19 13:02:09

您正在尝试处理多行格式的逐行格式。当然,例如,可以在if语句中设置一个指示符,并在完成时清除它:

代码语言:javascript
运行
复制
def extract_file(text):
  clean = []
  for line in text:
    if line.startswith("*CHI:"):
      append = True
    elif not line.startwith('\t'):
      append = False
    if append:
      line = line.replace('\t','')
      clean.append(line)
  return clean

另一种方法是在变量data中读取整个文件(或者可以使用mmap),然后使用regex提取感兴趣的数据:

代码语言:javascript
运行
复制
def extract_file(name):
  with open(name,"r",encoding = "UTF-8") as file:
    data = file.read()
  r = re.search("^(\*CHI:.*?)^[^\t]", data, re.M | re.S)
  return r.groups(1)[0].replace('\t','').split('\n')
票数 1
EN

Stack Overflow用户

发布于 2021-01-19 12:58:37

一种解决方案是使用bool来告诉您是否应该读取以制表符空间开头的行,然后将该行追加到干净列表中的最后一个条目中。

下面是您的extract_file函数的外观。

代码语言:javascript
运行
复制
def extract_file(text):
    clean = []
    read_tab_line = False
    for line in text:
        if line.startswith("*CHI:"):
            read_tab_line = True # we want to read the following tab lines
            clean.append(line)

        elif read_tab_line and line.startswith("\t"):
            clean[-1] += line
        else:
            read_tab_line = False # we do not want to read the following tab lines

    return clean
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65791631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档