在python中读取特定数量的行

在python中读取特定数量的行,python,data-mining,large-data,Python,Data Mining,Large Data,我有大数据文本文件,例如: #01textline1 1 2 3 4 5 6 2 3 5 6 7 3 3 5 6 7 6 4 4 6 7 8 9 9 1 2 3 6 4 7 3 5 7 7 8 4 4 6 6 7 8 5 3 4 5 6 7 8 4 6 7 8 8 9 .. .. 每行末尾都有一个换行符,因此: if line == "#03textline3": 将永远不会为真,因为该行实际上是“#03textline3\n”。为什么不使用与“#02textline2”相同的语法?这本

我有大数据文本文件,例如:

#01textline1
1 2 3 4 5 6
2 3 5 6 7 3
3 5 6 7 6 4
4 6 7 8 9 9

1 2 3 6 4 7
3 5 7 7 8 4
4 6 6 7 8 5

3 4 5 6 7 8
4 6 7 8 8 9
..
..

每行末尾都有一个换行符,因此:

if line == "#03textline3":
将永远不会为真,因为该行实际上是
“#03textline3\n”
。为什么不使用与
“#02textline2”
相同的语法?这本可以奏效的:

if "#03textline3" in line: # Or ' line == "#03textline3\n" '
    break;

此外,您必须更正
always\u print=True
行的缩进。

每行末尾都有一个换行符,因此:

if line == "#03textline3":
将永远不会为真,因为该行实际上是
“#03textline3\n”
。为什么不使用与
“#02textline2”
相同的语法?这本可以奏效的:

if "#03textline3" in line: # Or ' line == "#03textline3\n" '
    break;

此外,您必须更正
always\u print=True
行的缩进。

您不需要循环来实现您的目的。只需使用列表中的
index
函数即可获得两行的索引,并获取它们之间的所有行

请注意,我将您的
文件.readlines()
更改为删除尾随的换行符

< >代码>文件.Read().SPLILLIN()/Cyto>可能失败,如果<代码> Read()/Case>在数据行的中间结束。< /P>
您不需要一个循环来实现您的目的。只需使用列表中的
index
函数即可获得两行的索引,并获取它们之间的所有行

请注意,我将您的
文件.readlines()
更改为删除尾随的换行符

< >代码>文件.Read().SPLILLIN()/Cyto>可能失败,如果<代码> Read()/Case>在数据行的中间结束。< /P>
以下是我的建议:

firstKey = "#02textline2"
secondKey = "#03textline3"

with open("data.txt","r") as fread:
    for line in fread:
        if line.rstrip() == firstKey:
            break

    with open("newdata.txt","w") as fwrite:
        for line in fread:
            if line.rstrip() == secondKey:
                break
            else:
                fwrite.write(line)
这种方法利用了Python将文件视为迭代器这一事实。第一个
for
循环遍历文件迭代器
f
,直到找到第一个键。循环中断,但迭代器保持当前位置。当它被拾起时,第二个循环从第一个放卷的地方开始。然后,我们直接将您想要的行写入一个新文件,并丢弃其余的行

优势:

  • 这不会将整个文件加载到内存中,脚本只存储
    firstKey
    secondKey
    之间的行,并且只读取
    secondKey
    之前的行

  • 没有条目被检查或处理一次以上

  • 上下文管理器是使用文件的更安全的方法


    • 以下是我的建议:

      firstKey = "#02textline2"
      secondKey = "#03textline3"
      
      with open("data.txt","r") as fread:
          for line in fread:
              if line.rstrip() == firstKey:
                  break
      
          with open("newdata.txt","w") as fwrite:
              for line in fread:
                  if line.rstrip() == secondKey:
                      break
                  else:
                      fwrite.write(line)
      
      这种方法利用了Python将文件视为迭代器这一事实。第一个
      for
      循环遍历文件迭代器
      f
      ,直到找到第一个键。循环中断,但迭代器保持当前位置。当它被拾起时,第二个循环从第一个放卷的地方开始。然后,我们直接将您想要的行写入一个新文件,并丢弃其余的行

      优势:

      • 这不会将整个文件加载到内存中,脚本只存储
        firstKey
        secondKey
        之间的行,并且只读取
        secondKey
        之前的行

      • 没有条目被检查或处理一次以上

      • 上下文管理器是使用文件的更安全的方法


      缩进看起来不正确您读过吗?除了缩进问题之外,您正在打开带有“r”标志的文件2。行==“#03textline3”没有中断,因为有一个换行符(\n)导致条件失败。如果行中有“#03textline3”,则可以。缩进看起来不正确。您读过吗?除了缩进问题之外,您正在打开带有“r”标志的文件2。行==“#03textline3”没有中断,因为有一个换行符(\n)导致条件失败。如果行中有“#03textline3”,就可以了。实际上不需要加载和处理整个过程file@wnnmaw,这是一个非常公平的观点,但OP的原始解决方案已经将整个文件读取到内存中,所以我尽量靠近它,同时使逻辑尽可能清晰。@wnnmaw,基本的假设是,文件足够小,以至于将其读入内存的成本不足以让OP负责,实际上不需要加载和处理整个文件file@wnnmaw,这是一个非常公平的观点,但OP的原始解决方案已经将整个文件读入内存,因此,我试图尽可能接近它,同时使逻辑尽可能清晰。@wnnmaw,基本假设是该文件足够小,以至于将其读入内存的成本不足以让OP关注。