2017-09-13 69 views
-1

如何跳过第一个标题行?我在代码后面重复了标题,所以我可以通过如果不是l.startswith('MANDT')来消除它们,但是我想保留第一个标题。我需要如何修改代码?跳过一行 - python打开

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') 
+1

请[请修复您的缩进](https://stackoverflow.com/posts/46200139/edit)。严重缩减的Python代码是无稽之谈。 – khelwood

+2

你不应该在阅读时阅读你正在阅读的文件。 –

+0

@JulienPalard:他不会在同一时间读写:他首先用'read()'函数读取所有内容,因此所有内容都在内存中,然后截断文件。但是,我同意,这不是一个好的做法。 –

回答

0

你可以试试这个:

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

我希望我的权利得到您的问题。你可以做这样的事情:

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') 
1

只需使用切片:

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

OP:“我想保留的第一个标题” – Chris

1

有很多方法。我可能会从一个简单的变量开始,追踪第一个标题行是否已经被看到。

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 
0

可以剥去头是这样的:

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) 

你会得到相同的结果。

0

如果你的座右铭是删除所有以关键字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) 
+0

我需要用MANDT保留第一行。 – user2433705

+0

我知道了,请看第三行。 f.write(k +'/ n')是保持那条线。 –