2017-10-24 10 views
1

私はxの代わりにしようとしています。その行の新しいバージョンでテキストファイルの行を削除します。新しい行は古いものと同じですが、最初の文字 '#'はありません。最初の文字は削除できません。もちろん、文字列は不変です。 以下のスクリプトを作成しましたが、変更は行われません。問題のセクションを印刷するときは変わりません。私も同様にstring.replace()を使用してみましたが、どちらもうまくいきませんでした。 エラーが表示されないため、どこが間違っているのか分かりません。可変数の行を置換するループを作成する方法

import os 
import subprocess 

x = input('How many unique conformers were identified? ') 
with open('file.txt', 'r') as f: 
    f_contents = f.readlines() 
    for line in (f_contents[18:(18 + x)]): 
    newline = str(line[1:(len(line))]) 
    if line[0] == "#": 
     line = newline 
print f_contents[18:(18 + x)] 

    with open('x.txt', 'w') as f: 
    f.writelines(f_contents) 
+3

を私はあなたが実際にどこにでも戻ってディスクにラインを書いて表示されません。あなたは 'line'を再割り当てし、それで何もしません。 – Carcigenicate

+0

私はファイルを書き直しましたが、変更はありませんでしたので、上記のコードに問題があると仮定しました –

+0

すべての関連コードを[mcve]として表示してください。 – Carcigenicate

答えて

1
line = newline 

単にnewlineの値に名前lineを再バインド。値が変更不可能なため、f_contentsの値は変更されません。

あなたはf_contentsリストを更新する代わりに、これを試みることができる:

offset = 18 
x = input('How many unique conformers were identified? ') 

with open('file.txt', 'r') as f: 
    f_contents = f.readlines() 
    for i in range(offset, offset + x): 
    if f_contents[i].startswith('#'): 
     f_contents[i] = f_contents[i][1:] 

print f_contents[offset:offset + x] 

リストの内包表記を使用して、このスライスの割り当ても動作します:

with open('file.txt', 'r') as f: 
    f_contents = f.readlines() 
    f_contents[offset:offset+x] = [line[1:] if line.startswith('#') else line 
            for line in f_contents[offset:offset+x]] 

あなたが書くことを目指している場合更新されたコンテンツをファイルに戻す場合は、ファイルの行を繰り返し処理し、必要な範囲の行を更新して新しいファイルに書き出すことをお勧めします。

offset = 18 
x = input('How many unique conformers were identified? ') 

with open('file.txt', 'r') as infile, open('outfile.txt', 'w') as outfile: 
    for i, line in enumerate(infile): 
     if offset <= i < offset+x and line.startswith('#'): 
      line = line[1:] 
     outfile.write(line) 
+0

ヒーロー!素晴らしい仕事をして、新しい方法を学びました! –

1

私は上記のリンク先サイトから引用してみましょうfileinput

import fileinput 

x = input('How many unique conformers were identified? ') 
# Python3 input() returns an unevaluated string 
x = int(x) 

# fileinput objects can be used as context managers 
# the inplace=True argument directs to edit the file in place... 

with fileinput.input('file.txt', inplace=True) as f: 

    for line in f: 
     # decrement the line number to match the list indexing of OP 
     ln = f.lineno() - 1 
     # use "<=" and "<" to match slice addressing 
     if 18 <= ln < (18+x): 
      # if first character is "#" remove it 
      if line[0]=='#': line = line[1:] 
     print(line, end='') 

私は標準ライブラリモジュールをご紹介しましょう:

スクリプトはプリントを使用しますが()、何も出力が生成されませんfileinputは標準出力を上書きされるファイルにリダイレクトするためです。

PSは言及を忘れてしまった - バックアップファイルは、任意のさらなる処理の前に製造され...

関連する問題