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