Python 有没有一种方法可以使用;for loop";在带字符串的特定范围内?
嗨,stackoverflow用户 我想知道如何使用带字符串的for循环 比如说, 有一个文件(file.txt)如下: =====================Python 有没有一种方法可以使用;for loop";在带字符串的特定范围内?,python,file,if-statement,for-loop,Python,File,If Statement,For Loop,嗨,stackoverflow用户 我想知道如何使用带字符串的for循环 比如说, 有一个文件(file.txt)如下: ===================== Initial Value 1 2 3 3 4 5 5 6 7 Middle Value <---From Here 3 5 6 5 8 8 6 9 8 <---To Here Last Value 5
Initial Value
1 2 3
3 4 5
5 6 7
Middle Value <---From Here
3 5 6
5 8 8
6 9 8 <---To Here
Last Value
5 8 7
6 8 7
5 5 7
我被困在“直到行=='Last'”
部分
如有任何意见,我们将不胜感激
谢谢 请原谅,我访问文件的方式有点不同
with open('file.txt') as f:
file_string = f.read()
middle_to_end = file_string.split('Middle Value\n')[-1]
just_middle = middle_to_end.split('Last Value\n')[0]
middle_lines = just_middle.splitlines()
for line in middle_lines:
do_something
请原谅,我访问文件的方式有点不同
with open('file.txt') as f:
file_string = f.read()
middle_to_end = file_string.split('Middle Value\n')[-1]
just_middle = middle_to_end.split('Last Value\n')[0]
middle_lines = just_middle.splitlines()
for line in middle_lines:
do_something
在您的
if line=='Middle':
中,您可以翻转一个布尔标志,允许您输入另一个if In Middle and line=
last`语句,您可以在其中修改数字
您可以用这个替换for循环
inMiddle = false
for line in f:
sp1 = line.split()
line = "".join(sp1) + '\n'
if line == 'Middle':
inMiddle = true
if inMiddle and line != 'Last':
#MODIFY YOUR NUMBERS HERE
elif line == 'Last':
inMiddle = false
在您的
if line=='Middle':
中,您可以翻转一个布尔标志,允许您输入另一个if In Middle and line=
last`语句,您可以在其中修改数字
您可以用这个替换for循环
inMiddle = false
for line in f:
sp1 = line.split()
line = "".join(sp1) + '\n'
if line == 'Middle':
inMiddle = true
if inMiddle and line != 'Last':
#MODIFY YOUR NUMBERS HERE
elif line == 'Last':
inMiddle = false
有三种基本方法
第一种是使用状态机。您可以构建一个真正的状态机,但在这种情况下,状态和转换非常简单,只需使用一个标志就可以更简单地伪造它:
state = 0
for line in f:
sp1 = line.split()
line = " ".join(sp1) + '\n'
if state == 0:
if line == 'Middle\n':
state = 1
elif state == 1:
if line == 'Last\n':
state = 2
else:
# Thing you do until line == 'Last\n'
else:
# nothing to do after Last, so you could leave it out
请注意,我检查的是'Middle\n'
,而不是'Middle'
。如果您查看上面构建行的方式,它不可能与后者匹配,因为您总是添加'\n'
。但还要注意,与示例数据相比,该行是'Middle Value\n'
,而不是'Middle'
,因此,如果在实际数据中是这样的,则必须在此处处理。这是line==“Middle Value\n”
,line.startswith('Middle')
,还是其他取决于您的实际数据,只有您知道这些数据
或者,您可以将其分解为多个循环:
for line in f:
sp1 = line.split()
line = " ".join(sp1) + '\n'
if line == 'Middle\n':
break
for line in f:
sp1 = line.split()
line = " ".join(sp1) + '\n'
if line == 'Last\n':
break
else:
# Thing you do until line == 'Last\n'
for line in f:
# Nothing to do here, so you could leave the loop out
这个也有一些变化。例如:
lines = (" ".join(line.split()) + '\n' for line in f)
lines = dropwhile(lambda line: line != 'Middle', lines)
middle = takewhile(lambda line: line != 'End', lines)
for line in middle:
# Thing you want to do
最后,您可以在将文件转换为行之前拆分文件,而不是在转换之后拆分文件。这很难以迭代方式完成,因此让我们将整个文件读入内存来展示这一想法:
contents = f.read()
_, _, rest = contents.partition('\nMiddle\n')
middle, _, _ = rest.partition('\nEnd')
for line in middle.splitlines():
# Thing you want to do
如果将整个文件读入内存会浪费太多空间或占用太长时间,那么你的朋友就是你的朋友。有三种基本方法
第一种是使用状态机。您可以构建一个真正的状态机,但在这种情况下,状态和转换非常简单,只需使用一个标志就可以更简单地伪造它:
state = 0
for line in f:
sp1 = line.split()
line = " ".join(sp1) + '\n'
if state == 0:
if line == 'Middle\n':
state = 1
elif state == 1:
if line == 'Last\n':
state = 2
else:
# Thing you do until line == 'Last\n'
else:
# nothing to do after Last, so you could leave it out
请注意,我检查的是'Middle\n'
,而不是'Middle'
。如果您查看上面构建行的方式,它不可能与后者匹配,因为您总是添加'\n'
。但还要注意,与示例数据相比,该行是'Middle Value\n'
,而不是'Middle'
,因此,如果在实际数据中是这样的,则必须在此处处理。这是line==“Middle Value\n”
,line.startswith('Middle')
,还是其他取决于您的实际数据,只有您知道这些数据
或者,您可以将其分解为多个循环:
for line in f:
sp1 = line.split()
line = " ".join(sp1) + '\n'
if line == 'Middle\n':
break
for line in f:
sp1 = line.split()
line = " ".join(sp1) + '\n'
if line == 'Last\n':
break
else:
# Thing you do until line == 'Last\n'
for line in f:
# Nothing to do here, so you could leave the loop out
这个也有一些变化。例如:
lines = (" ".join(line.split()) + '\n' for line in f)
lines = dropwhile(lambda line: line != 'Middle', lines)
middle = takewhile(lambda line: line != 'End', lines)
for line in middle:
# Thing you want to do
最后,您可以在将文件转换为行之前拆分文件,而不是在转换之后拆分文件。这很难以迭代方式完成,因此让我们将整个文件读入内存来展示这一想法:
contents = f.read()
_, _, rest = contents.partition('\nMiddle\n')
middle, _, _ = rest.partition('\nEnd')
for line in middle.splitlines():
# Thing you want to do
如果将整个文件读入内存会浪费太多空间或占用太长时间,那么你的朋友就是你的朋友。基本上,你是在设置一个标志,表明你在“该部分”。下面我可以选择在完成时设置一个不同的标志。例如,当flag为2时,您可以退出
with open('file.txt') as f, open('out.txt', 'w') as f2:
section = 0;
for line in f:
if line.startswith("Middle"):
section = 1
elif line.startswith("Last"):
section = 2
if section == 1:
#collect digits and output to other file
f2.write(line)
elif section == 2:
#close file and break out
f.close()
f2.close()
break
else:
continue
基本上,你是在设置一个标志,表明你“在”部分。下面我可以选择在完成时设置一个不同的标志。例如,当flag为2时,您可以退出
with open('file.txt') as f, open('out.txt', 'w') as f2:
section = 0;
for line in f:
if line.startswith("Middle"):
section = 1
elif line.startswith("Last"):
section = 2
if section == 1:
#collect digits and output to other file
f2.write(line)
elif section == 2:
#close file and break out
f.close()
f2.close()
break
else:
continue
我只想将该过程编码为一个简单的FSM(一个或更具体地说是一个):
只需将pass
语句替换为读取输入文件时适当的操作即可。我只需将该过程编码为一个简单的FSM(一个或更具体地说是一个):
只需将pass
语句替换为在读取输入文件时适当执行的操作即可。您是否表示该文件始终有一行读取中间值?您几乎已经回答了自己的问题,在
loop@AM_Hawk:while循环在这里有什么帮助?@abarnert:while middle==true然后执行您的操作break@AM_Hawk:但是在while
循环中,您没有对循环的外部进行迭代,因此这只是围绕同一行的无限循环,这似乎不是很有用。你必须重写你的代码来进行文件的显式迭代(无论是使用next
,readline
,等等),而不是仅仅在它上面循环,这很难简化事情。你是说文件总是有一行读取中间值吗?你几乎回答了你自己的问题,在
loop@AM_Hawk:while循环在这里有什么帮助?@abarnert:while middle==true然后执行您的操作break@AM_Hawk:但是在while
循环中,您没有对循环的外部进行迭代,因此这只是围绕同一行的无限循环,这似乎不是很有用。你必须重写你的代码来进行文件的显式迭代(无论是使用next
,readline
,等等),而不是仅仅在它上面循环,这很难简化事情。没有list.split
方法。谢谢-我注意了一些其他的方法
在任何空格上拆分,而不仅仅是换行符,因此您将有像'3'
,5'
等行,而不是像'3 5 6'
这样的行。我想你的意思是分割线,所以我把它修好了。同时,我想我应该使用分区