读取两个单词之间的文件行

时间:2016-11-26 06:56:01

标签: python file python-2.x

我有一个包含数字和2个单词的文件:“start”和“middle” 我想从一个数组中的“start”到“middle”读取数字,从“中间”到文件末尾的数字读到另一个数组。 这是我的python代码:

with open("../MyList","r") as f:
        for x in f.readlines():
            if x == "start\n":
                continue
            if x == "middle\n":
                break
            x = x.split("\n")[0]
            list_1.append(int(x)) 

        print list_1

        for x in f.readlines():
            if x == "middle\n":
                continue
            list_2.append(int(x))

        print list_2

但问题是我的程序永远不会进入第二个循环并跳转到

print list_2

我搜索了较旧的问题,但无法弄清楚问题。

4 个答案:

答案 0 :(得分:2)

你的第一个循环是将整个文件读到最后,但只处理了一半。当第二个循环命中时,文件指针已经在末尾,因此不会读取新行。

来自python docs:

  

file.readlines([sizehint])

     

使用readline()读取EOF并返回包含这些行的列表   因此阅读。如果存在可选的sizehint参数,则代替   读取EOF,整行总计大小字节   (可能在四舍五入到内部缓冲区大小之后)被读取。   实现类文件接口的对象可以选择忽略   sizehint如果无法实现,或无法实现   有效。

在一个循环中处理所有内容,或逐行阅读(使用readline代替readlines)。

答案 1 :(得分:2)

因为你正在读取第一个循环的整体,当它进入第二个循环时,文件指针已经在文件的末尾,你将从f.readlines()获得一个空列表。

您可以通过重新打开文件或在第二个for循环之前使用f.seek(0)将文件指针再次设置为文件开头来解决此问题

with open("../MyList","r") as f:
    with open("../MyList","r") as f:
        for x in f.readlines():
            # process your stuff for 1st loop

        # reset file pointer to beginning of file again
        f.seek(0)

        for x in f.readlines():
            # process your stuff for 2nd loop

如果你正在处理大文件,将整个文件读入内存将不会那么有效,你可以迭代文件对象而不是像下面的代码一样读入内存

list1 = []
list2 = []
list1_start = False
list2_start = False
with open("../MyList","r") as f:
    for x in f:
        if x.strip() == 'start':
            list1_start = True
            continue
        elif x.strip() == 'middle':
            list2_start = True
            list1_start = False
            continue

        if list1_start:
            list1.append(x.strip())
        elif list2_start:
            list2.append(x.strip())

print(list1)
print(list2)

答案 2 :(得分:2)

您可以在列表中读取整个文件一次,稍后您可以对其进行切片。

如果可能的话你可以试试这个:

readyState

答案 3 :(得分:1)

讨论

您的问题是您一次读取整个文件,以及何时读取 开始第二个循环没有什么可读的......

可能的解决方案是逐行读取文件,跟踪 startmiddle个关键字,并更新两个列表中的一个 相应

这意味着您的脚本在循环期间必须保留有关的信息 它目前的状态,为此我们将使用一个 变量code,即012,表示无操作, 附加到清单号。 1或附加到清单号。 2,因为在开始 我们不想做任何事情,它的初始值必须是0

code = 0

如果我们想使用code的值访问两个列表中的一个 一个开关,我们可以写一个测试,或者,代替一个测试,我们可以使用一个 列表列表lists,包含一个虚拟列表和两个列表 用有效数字更新。最初所有这些内部列表都是相同的 到空列表[]

l1, l2 = [], []
lists = [[], l1, l2]

以便我们以后可以做到如下

    lists[code].append(number)

使用这些前提,可以很容易地在循环体上写入 文件行,

  • 读一个数字
  • 如果不是数字,请查看它是否为关键字
    • 如果是关键字,请更改状态
    • 无论如何,无需进一步处理
  • 如果我们必须追加,请附加到正确的列表

        try:
            n = int(line)
        except ValueError:
            if line == 'start\n' : code=1
            if line == 'middle\n': code=2
            continue
        if code: lists[code].append(n)
    

我们只需添加一些样板文件,打开文件即可 循环,就是这样。

下面你可以看到我的测试数据,所有的完整源代码 详细信息和脚本的测试执行。

演示

$ cat start_middle.dat
1
2
3
start
5
6
7
middle
9
10

$ cat start_middle.py
l1, l2 = [], []
code, lists = 0, [[], l1, l2]

with open('start_middle.dat') as infile:
    for line in infile.readlines():
        try:
            n = int(line)
        except ValueError:
            if line == 'start\n' : code=1
            if line == 'middle\n': code=2
            continue
        if code: lists[code].append(n)

print(l1)
print(l2)
$ python start_middle.py 
[5, 6, 7]
[9, 10]
$ 
相关问题