2016-10-14 9 views
1

私は、170のオランダ語小説からなるテキストファイルのコーパスを準備しています。私は文学者であり、比較的Pythonの初心者でもあり、一般的なプログラミングでもあります。私がしようとしているのは、小説の実際の内容(すなわちストーリー)に属さない各.txtファイルからすべてを取り除くためのPythonスクリプトを書くことです。私が削除したいのは、ePubを.txtに変換する際の著者、blurbs、その他の情報が追加された経歴です。Pythonを使ってtxtファイルからparatext(または 'ノイズ')を取り除く

私の考えは、実際の小説の内容が始まる行と終了する行の各.txtファイルを手動で決定することです。

def removeparatext(inputFilename, outputFilename): 
    inputfile = open(inputFilename,'rt', encoding='utf-8') 
    outputfile = open(outputFilename, 'w', encoding='utf-8') 

    for line_number, line in enumerate(inputfile, 1): 
     if line_number >= 80 and line_number <= 2741: 
      outputfile.write(inputfile.readline()) 

    inputfile.close() 
    outputfile.close() 

removeparatext(inputFilename, outputFilename) 

番号80と2741年の開始と終了番号をされています。私は、これらの2つのライン番号の間に含まれていないの.txtファイル内のすべての情報を除去する目的のために次のコードブロックを使用しています特定の小説の実際の内容。ただし、出力ファイルは、行番号80の前にテキストが削除された.txtファイルのみを出力します。行番号2741の行番号をまだ含んでいます。理由はわかりません。おそらく、私は正しい方法でenumerate()関数を使用していません。

もう1つのことは、.txtファイル内のすべての不要なスペースを取り除きたいということです。しかし、.strip()メソッドは、このコードブロックで実装すると動作しないようです。

誰も私にこの問題を解決する方法についての示唆を与えることができますか?事前に多くの感謝!

答えて

1

enumerate既にそのインデックスと一緒にラインを提供するので、あなたはそれが予期しない動作につながるとして再度ファイルオブジェクトにreadlineを呼び出す必要はありません - 複数の二重ペースでファイルオブジェクトを読み込むよう:

代替案として

for line_number, line in enumerate(inputfile, 1): 
    if line_number >= 80 and line_number <= 2741: 
     outputfile.write(line) 
#      ^^^^ 
enumerateを使用してファイル全体を反復し、あなたは が開始とSTOを取るitertools.isliceを使用してファイルオブジェクトをスライス検討することができますまた

from itertools import islice 

def removeparatext(inputFilename, outputFilename): 
    inputfile = open(inputFilename,'rt', encoding='utf-8') 
    outputfile = open(outputFilename, 'w', encoding='utf-8') 

    # use writelines to write sliced sequence of lines 
    outputfile.writelines(islice(inputfile, 79, 2741)) # indices start from zero 

    inputfile.close() 
    outputfile.close() 

、することができますオープンファイルを、コンテキストマネージャを使用してのPythonへのクロージング/クリーンアップを残す:P指数、その後、writelines使用して出力ファイルにスライスされたシーケンスを書きますwith声明。 How to open a file using the open with statementを参照してください。

from itertools import islice 

def removeparatext(inputFilename, outputFilename): 
    with open(inputFilename,'rt', encoding='utf-8') as inputfile,\ 
     open(outputFilename, 'w', encoding='utf-8') as outputfile:  
     # use writelines to write sliced sequence of lines 
     outputfile.writelines(islice(inputfile, 79, 2741)) 


removeparatext(inputFilename, outputFilename) 
+0

ありがとうございました! itertools.isliceを使用すると、私のためにうまく動作します。私はすでにファイルを開くためにwith文を使用していることを認識していましたが、1つではなく2つのファイルを開くときにどのように使用するかはわかりませんでした。 – roelmetgevoel

関連する問題