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 有没有一种方法可以使用;for loop";在带字符串的特定范围内?_Python_File_If Statement_For Loop - Fatal编程技术网

Python 有没有一种方法可以使用;for loop";在带字符串的特定范围内?

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

嗨,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 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'
这样的行。我想你的意思是分割线,所以我把它修好了。同时,我想我应该使用分区