Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 读取两个单词之间的文件行_Python_File_Python 2.x - Fatal编程技术网

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

Python 读取两个单词之间的文件行,python,file,python-2.x,Python,File,Python 2.x,我有一个包含数字和两个单词的文件:“开始”和“中间” 我想在一个数组中读取从“开始”到“中间”的数字,在另一个数组中读取从文件“中间”到文件结尾的数字。 这是我的python代码: with open("../MyList","r") as f: for x in f.readlines(): if x == "start\n": continue if x == "middle\n":

我有一个包含数字和两个单词的文件:“开始”和“中间” 我想在一个数组中读取从“开始”到“中间”的数字,在另一个数组中读取从文件“中间”到文件结尾的数字。 这是我的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

我在以前的问题中搜索过,但无法找出问题所在。

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

从python文档中:

readlines([sizehint])

使用readline()读取直到EOF,并返回包含行的列表 这样读。如果存在可选的sizehint参数,而不是 读取到EOF,整行总计约为sizehint字节 (可能在四舍五入到内部缓冲区大小后)被读取。 实现类似文件的接口的对象可以选择忽略 如果无法实现或无法实现,则为sizehint 效率高


可以在一个循环中处理所有内容,也可以逐行读取(使用
readline
而不是
readlines
)。

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

从python文档中:

readlines([sizehint])

使用readline()读取直到EOF,并返回包含行的列表 这样读。如果存在可选的sizehint参数,而不是 读取到EOF,整行总计约为sizehint字节 (可能在四舍五入到内部缓冲区大小后)被读取。 实现类似文件的接口的对象可以选择忽略 如果无法实现或无法实现,则为sizehint 效率高


要么在一个循环中处理所有内容,要么逐行读取(使用
readline
而不是
readlines
)。

这是因为您在第一个循环中读取整个内容,当它进入第二个循环时,文件指针已经在文件末尾,您将从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)

这是因为您在第一个循环中读取整个文件,当它进入第二个循环时,文件指针已经在文件末尾,您将从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)

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

如果可能,您可以尝试以下方法:

with open("sample.txt","r") as f:
        list_1 = []
        list_2 = []
        fulllist = []
        for x in f.readlines():
            x = x.split("\n")[0]
            fulllist.append(x)

        print fulllist 

        start_position = fulllist.index('start')
        middle_position = fulllist.index('middle')
        end_position = fulllist.index('end')
        list_1 = fulllist[start_position+1 :middle_position] 
        list_2 = fulllist[middle_position+1 :end_position]
        print "list1 : ",list_1
        print "list2 : ",list_2 

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

如果可能,您可以尝试以下方法:

with open("sample.txt","r") as f:
        list_1 = []
        list_2 = []
        fulllist = []
        for x in f.readlines():
            x = x.split("\n")[0]
            fulllist.append(x)

        print fulllist 

        start_position = fulllist.index('start')
        middle_position = fulllist.index('middle')
        end_position = fulllist.index('end')
        list_1 = fulllist[start_position+1 :middle_position] 
        list_2 = fulllist[middle_position+1 :end_position]
        print "list1 : ",list_1
        print "list2 : ",list_2 
讨论 您的问题是,您一次读取整个文件,并且 开始第二个循环,没有什么可读的

一个可能的解决方案是逐行读取文件,跟踪
开始
中间
关键字并更新两个列表之一 因此

这意味着您的脚本在循环期间必须保存有关 它的当前状态,为此,我们将使用 变量,
code
,即
0
1
2
表示无操作, 附加到列表1或附加到列表2,因为在开始时 我们不想做任何事情,它的初始值必须是
0

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

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)
    
我们只需添加一些样板文件,打开文件 循环,仅此而已

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

演示 讨论 您的问题是,您一次读取整个文件,并且 开始第二个循环,没有什么可读的

一个可能的解决方案是逐行读取文件,跟踪
开始
中间
关键字并更新两个列表之一 因此

这意味着您的脚本在循环期间必须保存有关 它的当前状态,为此,我们将使用 变量,
code
,即
0
1
2
表示无操作, 附加到列表1或附加到列表2,因为在开始时 我们不想做任何事情,它的初始值必须是
0

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

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