2017-09-13 5 views
-1

どのように最初のヘッダ行をスキップできますか?ヘッダーはコードの後半に複製されていますので、l.startswith( 'MANDT')ではなく、最初のヘッダーを残しておきます。コードをどのように変更する必要がありますか?1行をスキップする - 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) 

あなたは同じ結果を得る。あなたのモットーは、最初の行を除いて、キーワードMANDTで始まるすべての行を削除する場合

0

、これは正常に動作します。

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

私はそれを知っていた、ちょうど3番目の最後の行を見てください。 f.write(k + '/ n')はその行を保持することです。 –

関連する問題