2017-12-16 22 views
-1

ファイルがあるため、条件に従って特定の行を更新する必要があります。下の問題でコードを追加しました。更新された行を印刷することができません。条件が満たされたときにファイルを更新できない

if two consecutive lines has CAR words 
at least any of consecutive lines should have '*' in it 
if above two condition is satisfied then 
put '*' two next two lines also ,make sure if a line already has '*' do not add '*' in it 

findally更新されたコードのファイルは、

例えば

ご注意ファイルには、インスタンスの数百人を含むテキストファイルを更新し、すべての

を修正する必要がありますここ

filename4.txt

------------- 
* CAR SDFSG FDSFDFDSF 
    CAR FDGDSGGF 
bla bla 
bla 

CAR SDdsfdfFSG FDSFDFDSF 
    CAR FdffdsDGDSGGF 
bla 
bla 
---------- 
expected updated file should be like this 

* CAR SDFSG FDSFDFDSF 
*  CAR FDGDSGGF 
*bla bla 
*bla 

CAR SDdsfdfFSG FDSFDFDSF 
    CAR FdffdsDGDSGGF 
bla 
bla 
------------------- 

は私のコード

import re 
with open("filename4.txt","r+") as file: 
     lines = file.readlines() 

     x=0 

     if re.findall("CAR",lines[x]) and re.findall("CAR",lines[x+1]): 
      if re.findall("\*",lines[x]) or re.findall("\*",lines[x+1]): 
      if not re.findall("\*",lines[x]): 
       lines[x] = "  * "+lines[x] 
       print(lines[x]) 
      if not re.findall("\*",lines[x+1]): 
       lines[x+1] = "  * "+lines[x+1] 
       print(lines[x+1]) 
      if not re.findall("\*",lines[x+2]): 
       lines[x+2] = "  * "+lines[x+2] 
       print(lines[x+2]) 
      if not re.findall("\*",lines[x+3]): 
       lines[x+3] = "  * "+lines[x+3] 
       print(lines[x+3]) 
+2

を使用していますと、質問がありますか、あなたはちょうど私達に伝えたいんでした、あなたのことコードを書いた? – MrT

+1

人々にコードをレビューさせたい場合は、スタックオーバーフローはそのサイトではありません。 [codereviews.se]に投稿してください。ただし、投稿ガイドラインを最初に確認してください。彼らはまたあなたが抱えている問題の種類を知りたいと思っています。 – tripleee

+0

私はアップデートファイルを作成することはできませんよ、私はhahahahahahahahahahahahahahahahahaha自分の努力だけ@Piinthesky – jonty

答えて

1

ある空白行で区切られ、あなたが一緒に行く、複数のラインを持っていることを表示され、すべての変更は、この全体的に行われ記録。したがって、ファイルをレコードに分割する必要があります。

これを実行すると、残りは簡単になります。また、さまざまなタスクを処理するための関数の使用に注目し、コードの各部分を1つの特定のタスク(主に)に対応させるようにします。

# print one multi-line record 
def output_record(lines): 
    needs_prefix = is_condition_met(lines) 
    for line in lines: 
     if needs_prefix and '*' not in line: 
      print ('*', line) 
     else: 
      print (line) 
    print() 

# determine if this record meets the condition for special handling 
def is_condition_met(lines): 
    if len(lines) >= 2: 
     if 'CAR' in lines[0] and 'CAR' in lines[1]: 
      if '*' in lines[0] or '*' in lines[1]: 
       return True 
    return False 

# because I didn't want to do file IO in this example 
all_lines = [ 
    '* CAR SDFSG FDSFDFDSF ', 
    ' CAR FDGDSGGF', 
    'bla bla', 
    'bla', 
    '', 
    ' CAR SDdsfdfFSG FDSFDFDSF ', 
    '  CAR FdffdsDGDSGGF', 
    'bla ', 
    'bla' 
] 

# parse the whole file into multi-line records 
lines_this_record = [] 
for line in all_lines: 
    if line: 
     lines_this_record.append(line) 
    else: 
     output_record(lines_this_record) 
     lines_this_record = [] 

# last record may still need to be printed, 
# if we look for newlines, but there was no blank line at the end of file 
if lines_this_record: 
    output_record(lines_this_record) 
+0

@tripleeeおかげでも、私は正規表現を使用していません過剰なあなたはちょうど文字列リテラルを見つける必要があり、文字列のpythonの "in"演算子はそれを処理します。実際のコードでそれ以上のことがあるので正規表現が必要な場合は、先に進んでください。 –

+0

特記事項 - 私の記録解析は余分な改行を削除します。それが起こらないようにするには、それらをレコードに追加し、空白行を正しく処理するようにoutput_recordを修正します。 –

+0

ありがとう、私はそれ自体ができると思ったことはありません – jonty

0

はケニーありがとう、あなたの答えはここに私をたくさん を助け代替バージョンであり、私はfindAllのより頻繁に

import re 


def comment(a,b): 
# print("comment on",a,"condn",b) 
    if b == 1: 
    list[a+1] = "  * " + list[a+1] 
    list[a+2] = "  * " + list[a+2] 
    list[a+3] = "  * " + list[a+3] 
    if b == 2: 
    list[a+2] = "  * " + list[a+2] 
    list[a+3] = "  * " + list[a+3 
            ] 
    list[a] = "  * " + list[a] 
    if b == 3: 
    print(a) 
    list[a+2] = "  * " + list[a+2] 
    list[a+3] = "  * " + list[a+3] 


with open("filename4.txt","r+") as file: 
    lines = file.readlines() 
    list = lines[:] 
    x=0 
    for line in lines: 
     if re.findall("CAR",lines[x]) and re.findall("CAR",lines[x+1]): 
      if re.findall("\*",lines[x]) or re.findall("\*",lines[x+1]): 
      if re.findall("\*",lines[x]): 
       if not re.findall("\*",lines[x+1]): 
       comment(x,1) 
      if not re.findall("\*",lines[x]): 
       if re.findall("\*",lines[x+1]): 
       comment(x,2) 

      if re.findall("\*",lines[x]): 
       if re.findall("\*",lines[x+1]): 
       comment(x,3) 


     x=x+1 


with open('path.txt', 'w') as file_handler: 
    for item in list: 
     file_handler.write("{}".format(item)) 
関連する問題