如何在Python中仅查看txt文件的下几行内容

2024-09-30 14:23:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用for循环和if语句在Python中创建一个文本文件,以确定行中是否有某些元素并返回这些元素。如果我的元素与键在同一行,这就足够简单了,但是我不知道如何创建txt文件的“子块”,然后只遍历这些子块。你知道吗

我的意思是,如果我有

    WKU  D02807769
SRC  6
APN  427637&
APT  4
ART  292
APD  19820929
TTL  Athletic shoe with pocket
ISD  19851001
NCL  1
ECL  1
EXP  Holtje; Nelson C.
NDR  2
NFG  4
TRM  14
INVT
NAM  Gamm; Robert J.
CTY  St. Louis
STA  MO
ASSG
NAM  Kangaroos U.S.A., Inc.
CTY  St. Louis
STA  MO
COD  02
RLAP
...
...
UREF
PNO  D110163
ISD  19380600
NAM  Andrews
UREF
PNO  D116598
ISD  19390900
NAM  Pick
UREF
PNO  D130845
ISD  19411200
NAM  Pick
UREF

通过查找WKU返回“D02807769”非常简单,但是如果我只想查看(例如)ASSG之后但下一个标记之前的元素(在本例中为“RLAP”,但它可以是其他内容,尽管行数相同),我不确定如何继续。你知道吗

例如,如果我想返回ASSG下NAM(“Kangaroos U.S.A.,Inc.”)的值,而不是文件中NAM的其他值,我不知道该怎么做。你知道吗

我试过一句话: 而line.startswith开始(“ASSG”)或len(line)>;4:

但这似乎给了我一个无限的循环。我也试过了

line.next()

但出现了一个错误AttributeError:'_io.TEXTIO包装器'对象没有属性'next'

我不知道如何找到这些间接块来搜索我要找的东西。我想这是某种for循环,但我不知道该怎么写


Tags: 文件元素forline子块stctylouis
1条回答
网友
1楼 · 发布于 2024-09-30 14:23:04

将搜索值分为两个步骤:

  1. 查找类别(ASSG)
  2. 找到钥匙(NAM)

如果在步骤2中找到其他类别,请中止搜索。你知道吗

def find_value(infile, category, key):
    # first, search for the category header - a line with a single word
    for line in infile:
        line= line.strip()
        if line == category:
            # we found the category header, now search for a line that
            # starts with the key
            key = key + ' '
            for line in infile:
                if line.startswith(key):
                    return line[len(key):].lstrip()

                # if this is another category header, stop searching
                line = line.strip()
                if not ' ' in line:
                    break

试运行:

>>> print(find_value(infile, 'ASSG', 'NAM'))
Kangaroos U.S.A., Inc.

或者,可以使用regex:

import re

def find_value(infile, category, key):
    text = infile.read()
    template = r'(?sm)^{category}$\s+^(?:\S+ +\S[^\n]*$\s+^)*{key}\s+([^\r\n]+)'
    pattern = template.format(category=re.escape(category),
                              key=re.escape(key))
    match = re.search(pattern, text)
    if match is None:
        return None
    return match.group(1)

这个正则表达式做了几乎相同的事情-它搜索一个等于“ASSG”的行,然后搜索一个以“NAM”开头的行,如果它找到一个只包含一个单词的行,则中止搜索。你知道吗

相关问题 更多 >