我有一个包含数字和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
我搜索了较旧的问题,但无法弄清楚问题。
答案 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)
您的问题是您一次读取整个文件,以及何时读取 开始第二个循环没有什么可读的......
可能的解决方案是逐行读取文件,跟踪
start
和middle
个关键字,并更新两个列表中的一个
相应
这意味着您的脚本在循环期间必须保留有关的信息
它目前的状态,为此我们将使用一个
变量code
,即0
,1
或2
,表示无操作,
附加到清单号。 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]
$