【问题标题】:Skip one line - python open with跳过一行 - python 打开
【发布时间】:2025-12-10 03:00:01
【问题描述】:

如何跳过第一个标题行?我在代码的后面有重复的标题,所以我可以通过 if not l.startswith('MANDT') 但我想保留的第一个标题来消除它们。我需要如何修改代码?

keep -> MANDT|BUKRS|NETWR|UMSKS|UMSKZ|AUGDT|AUGBL|ZUONR
100|1000|23.321-|||||TEXT
100|1000|0.12|||||TEXT
100|1500|90|||||TEXT
remove -> MANDT|BUKRS|NETWR|UMSKS|UMSKZ|AUGDT|AUGBL|ZUONR
100|1000|23.321-|||||TEXT
100|1000|0.12|||||TEXT
100|1500|90|||||TEXT
remove -> MANDT|BUKRS|NETWR|UMSKS|UMSKZ|AUGDT|AUGBL|ZUONR

我正在使用的代码。

with open('yourfile.txt', 'r+') as f:  # 'r+' - read/write mode
    lines = f.read().splitlines()
    f.seek(0)  # reset file pointer
    f.truncate()  # truncating file contents
    for l in lines:
        if not l.startswith('---'):
            # or f.write('|'.join(map(str.strip, l.strip('|').split('|'))) + '\n')
            f.write(re.sub(r'\|\s*|\s*\|', '|', l).strip('|') + '\n')

【问题讨论】:

  • fix your indentation。严重缩进的 Python 代码是无稽之谈。
  • 你不应该在阅读的同时写在同一个文件上。
  • @JulienPalard:他不会同时读写:他首先用read()函数读取所有内容,所以所有内容都在内存中,然后他截断文件。但是,我同意,这不是一个好习惯。
  • @LaurentLAPORTE 啊,是的,我读得太快了,跳过了查找和截断,但如果目标是将所有内容加载到内存中,第一次打开时只用“r”打开第二次会更清楚仅带有“w”。
  • 阅读器设置为__next__,可用于将迭代推进一行,跳过第一行。

标签: python readlines


【解决方案1】:

只使用切片:

for l in lines[1:]:
  # do stuff

【讨论】:

  • OP:“我要保留的第一个标题”
【解决方案2】:

有很多方法。我可能会先使用一个简单的变量来跟踪是否看到了第一行标题。

expected_header = 'MANDT|BUKRS...'

with open('yourfile.txt', 'r+') as f:   # 'r+' - read/write mode
    # ... get lines ...

header_seen = False
for l in lines:
    if l == expected_header:
        if header_seen:
            # do nothing, just skip to the next line in the file
            continue
        else:
             # act on this line, but remember not to parse further headers
            header_seen = True 
    # do something with the line here

【讨论】:

    【解决方案3】:

    你可以试试这个:

    f = [i.strip("\n") for i in open('filename.txt')]
    new_file = [f[0]]+[i for i in f[1:] if i != f[0]]
    

    【讨论】:

      【解决方案4】:

      我希望你的问题是正确的。你可以这样做:

      with open('yourfile.txt', 'r+') as f:   # 'r+' - read/write mode
      lines = f.read().splitlines()
      f.seek(0)      # reset file pointer
      f.truncate()   # truncating file contents
      isFirstLine = True
      for l in lines:
          if isFirstLine:
              isFirstLine = False
              continue
          if not l.startswith('---') and :
              # or f.write('|'.join(map(str.strip, l.strip('|').split('|'))) + '\n')
              f.write(re.sub(r'\|\s*|\s*\|', '|', l).strip('|') + '\n')
      

      【讨论】:

        【解决方案5】:

        你可以像这样去掉标题:

        from __future__ import print_function
        
        import io
        
        lines = f.read().splitlines()
        f.seek(0)
        f.truncate()
        
        header = None
        for line in lines:
            if line.startswith(u"MANDT"):
                if header:
                    continue
                else:
                    header = line
                    print(line, file=f)
            else:
                print(line, file=f)
        

        你得到:

        MANDT|BUKRS|NETWR|UMSKS|UMSKZ|AUGDT|AUGBL|ZUONR
        100|1000|23.321-|||||TEXT
        100|1000|0.12|||||TEXT
        100|1500|90|||||TEXT
        100|1000|23.321-|||||TEXT
        100|1000|0.12|||||TEXT
        100|1500|90|||||TEXT
        

        当然,你可以使用索引来简化:

        for index, line in enumerate(lines):
            if not index or not line.startswith(u"MANDT"):
                print(line, file=f)
        

        你会得到同样的结果。

        【讨论】:

          【解决方案6】:

          如果您的座右铭是删除以关键字MANDT 开头的所有行,但第一行除外,那么这将正常工作。

          with open('yourfile.txt') as f:
              data = f.readlines()
          
          k = data[0]
          for line in data:
              if line.startswith('MANDT'):
                  data.remove(line)
          
          with open('yourfile2.txt','w') as f:
              f.write(k + '/n')
              for line in data:
                  f.write(line)
          

          【讨论】:

          • 我需要用 MANDT 保留第一行。
          • 我知道了,看看倒数第三行。 f.write(k + '/n') 是保留那条线。