2016-04-04 7 views
1

特定のディレクトリの拡張子(pdb)で終わるすべてのファイルに対して、それぞれ行のに対して操作を実行したいとします。私の次のコードでは、{lines = pdbinput.read()}行を行のにstartswith()操作を実行することはできません。特定の拡張子で終わるディレクトリ内のすべてのファイルの各行で操作を実行する方法は?

import glob, os 
os.chdir("F:/python") 
for files in glob.glob("*.pdb"): 
    with open(files) as pdbinput: 
     lines = pdbinput.read() 
     with open ('output.txt', 'w') as f1: 
      for line in lines: 
       if line.startswith("HETATM"): 
        print (line, file=f1) 

しかし、それは私が直接ラインを印刷することができます:

import glob, os 
os.chdir("F:/python") 
for files in glob.glob("*.pdb"): 
    with open(files) as pdbinput: 
     lines = pdbinput.read() 
     with open ('modified.txt', 'w') as f1: 
      print (lines, file=f1) 
+1

をあなたはそれが「許可しない」ということは何を意味するか、あなたが '' line.startswith()を行うには?それは効果がありませんでしたか?エラーが発生しましたか?具体的に。 – TigerhawkT3

+0

ファイルの内容をインプレースで変更する場合は、['fileinput'](https://docs.python.org/2/library/fileinput.html)モジュールを見てください。これを行うだけでなく、あなたのコードを大幅に簡素化します。 – tripleee

+0

これを指定しないと申し訳ありません。最初のケースでは、出力の種類はありませんが、2番目のケースでは、拡張子 "pdb"で終わる各ファイルのすべての行を出力して出力します。 –

答えて

0

pdbinput.read()は、単一の文字列にファイル全体を読み込みます。つまり、その後のfor line in linesは、行単位ではなく文字単位でその文字列を反復処理します。

with open(files) as pdbinput: 
    with open ('output.txt', 'w') as f1: 
     for line in pdbinput: 
      if line.startswith("HETATM"): 
       print (line, file=f1) 

次の問題:あなたはpdbinput.readlines()か(通常の方法)を使用することができますいずれか

は、直接ファイルを反復今、各PDBファイルに対して、新しいoutput.txtが生成され、以前のものを上書きします。ただ、繰り返しの外にそのwithブロックを移動:

with open ('output.txt', 'w') as f1: 
    for files in glob.glob("*.pdb"): 
     with open(files) as pdbinput: 
      for line in lines: 
       if line.startswith("HETATM"): 
        print (line, file=f1) 
+0

ありがとうTim!これは私が立ち往生した場所です! :) –

関連する問題