如何使用Python读取文件中的一系列行

如何使用Python读取文件中的一系列行,python,file-io,Python,File Io,我试图完成读取文件中重复出现的行的任务。该行以004开头,以819结尾(这些代表订单。可以是1个或1000多个订单-周期性范围)。我想得到在第004行上有一个特定数字的特定文件,并得到819行之前的所有行,以及此后任何其他匹配的004行。我已经尝试过了,但在一定范围内的线路上遇到了困难。我试着想过去,但一直碰壁。感谢您的帮助和/或指导 我正在读取的文件是一个.txt文件,格式为: ... 004 54566 006 P56 008 Name 010 61758012 018 UMC 027

我试图完成读取文件中重复出现的行的任务。该行以004开头,以819结尾(这些代表订单。可以是1个或1000多个订单-周期性范围)。我想得到在第004行上有一个特定数字的特定文件,并得到819行之前的所有行,以及此后任何其他匹配的004行。我已经尝试过了,但在一定范围内的线路上遇到了困难。我试着想过去,但一直碰壁。感谢您的帮助和/或指导

我正在读取的文件是一个.txt文件,格式为:

...
004 54566
006 P56
008 Name 
010 61758012
018 UMC  
027
...
819 Staven
以下是迄今为止我为阅读这一行而编写的代码:

os.chdir(r"C:\\mydirectory")
wrkdir = os.getcwd()
filelist = os.listdir(wrkdir)

sampleList = [filename for filename in filelist if filename.endswith(".SFX")]

filelist = sampleList

for sfx in filelist:
with open(sfx, 'r') as rfile:
    lines = rfile.readlines()
    for line in lines:
        count+=1
        if line[0:3] == '004':
            gstring = line.split(' ')
            #if gstring[1] == '8041': (This line did not work for me)
                print line #(ultimately I will write these lines to a new file)

在这之后我画了一个空白,不知道如何在行范围004-819之间打印,如果004=='特定数字'

基本上是一个状态机

for sfx in filelist:
    with open(rxf, 'r') as rfile:
        keep = False
        for line in rfile:
            if line.startswith('004'):
                gstring = line.split() # white space
                if '8041' in gstring:
                    keep = True

            if keep and line.startswith('819'):
                print line
                keep = False

            if keep:
                print line

基本上是一个状态机

for sfx in filelist:
    with open(rxf, 'r') as rfile:
        keep = False
        for line in rfile:
            if line.startswith('004'):
                gstring = line.split() # white space
                if '8041' in gstring:
                    keep = True

            if keep and line.startswith('819'):
                print line
                keep = False

            if keep:
                print line

readlines
也读取新行字符,在进一步使用您的行之前,您必须去除这些字符。

readlines
也读取新行字符,您必须在进一步使用您的行之前去除这些字符。

这应该有效。在当地进行测试

prefix = "004"
prefix_len = len(prefix) + 1 # +1 for space
end_line_prefix = "819"
desired_value = "8041"
with open("input.txt", "r") as rfile:
    for line in rfile:
        if not line.startswith(prefix):
            continue  # if it doesnt start with 004, not interested

        val = line[prefix_len:len(line) - 1]  # at the end we also have new line
        if val != desired_value:
            continue  # if 004 doesnt have the value of our interest, skip

        while True:
            print("-> %s" % line)
            line = rfile.readline()
            if line.startswith(end_line_prefix):  # if we reached the line starting with 819, we print and then break
                print("-> %s" % line)
                break
rfile.close()

这应该行得通。在当地进行测试

prefix = "004"
prefix_len = len(prefix) + 1 # +1 for space
end_line_prefix = "819"
desired_value = "8041"
with open("input.txt", "r") as rfile:
    for line in rfile:
        if not line.startswith(prefix):
            continue  # if it doesnt start with 004, not interested

        val = line[prefix_len:len(line) - 1]  # at the end we also have new line
        if val != desired_value:
            continue  # if 004 doesnt have the value of our interest, skip

        while True:
            print("-> %s" % line)
            line = rfile.readline()
            if line.startswith(end_line_prefix):  # if we reached the line starting with 819, we print and then break
                print("-> %s" % line)
                break
rfile.close()


在您的文件内容示例中,您希望得到的确切内容是什么?@aabilio从示例文本文件中,如果第004行=='某个数字',则获取到第819行的所有行。然后,如果下一个004==‘某个数字’也会得到后续的行,因此第四行。行号不是连续的?不是连续的,而是递增的,直到819。在您的文件内容示例中,您想要得到的确切内容是什么?@aabilio来自示例文本文件,如果行004=‘某个数字’,则得到819行之前的所有行。然后,如果下一个004==‘某个数字’也会得到后续的行,因此第四行。行号不是连续的?不是连续的,而是递增的,直到819。这将始终打印从819开始的行。第'if line.startswith('819')`@gkusner行也缺少冒号,因为某些原因,它只是打印第819行。此外,我在您发布的代码上方有一行代码:for rxf in file filelist:修复了注意到的错误,并且我只在每个文件中输入了必要的代码-仍然需要另一个for loop,所以只需缩进即可further@gkusner工作起来很有魅力,不知道我为什么会被卡住,但我理解你的过程(非常直截了当)@gkusner现在我唯一需要弄清楚的是,它似乎忽略了嵌套的if语句(if'8041'…)。它打印所有订单,而不考虑“8041”条件。但我可以接受。这将始终打印从819开始的行。第'if line.startswith('819')`@gkusner行也缺少冒号,因为某些原因,它只是打印第819行。此外,我在您发布的代码上方有一行代码:for rxf in file filelist:修复了注意到的错误,并且我只在每个文件中输入了必要的代码-仍然需要另一个for loop,所以只需缩进即可further@gkusner工作起来很有魅力,不知道我为什么会被卡住,但我理解你的过程(非常直截了当)@gkusner现在我唯一需要弄清楚的是,它似乎忽略了嵌套的if语句(if'8041'…)。它打印所有订单,而不考虑“8041”条件。但我可以接受这一点。下面是一个返回的Jay,仍在尝试排除故障:->004 60981回溯(最后一次调用):文件“F:\Python\WinPython-32bit-2.7.10.2\Python-2.7.10\getOrders\u RXF.py”,第50行,in line=rfile.readline()value错误:混合迭代和读取方法将丢失数据我提供的是Python 3代码。尝试使用Python3。下面是返回的Jay仍在尝试排除故障的内容:->004 60981回溯(最近一次调用):文件“F:\python\WinPython-32bit-2.7.10.2\python-2.7.10\getOrders\u RXF.py”,第50行,in line=rfile.readline()value错误:混合迭代和读取方法将丢失数据我提供的是Python3代码。尝试使用Python3。