2016-03-26 9 views
8

Pythonを使用して、Project Gutenbergのテキストのような不要な改行を取り除く方法を知りたいのですが、それらのプレーンテキストファイルはすべて改行で整形されています70文字ほどです。これは、2つの改行(改行やタブ)で区切られた別の段落を続けるだろうPythonで不必要な改行を削除する最も効率的な方法

set newtext [string map "{\r} {} {\n\n} {\n\n} {\n\t} {\n\t} {\n} { }" $oldtext] 

が、(単一の改行で終わった一緒にラインを実行します:Tclで、私はこのように、簡単なstring mapを行うことができますスペースを代用する)、余分なCRを削除します。 Pythonにはstring mapがないので、不要な改行をすべてダンプする最も効率的な方法をまだ見つけることはできませんでしたが、ではなく、という順番で各改行を検索して置き換えますスペースで。私はPythonでTclの式を評価することができますが、それ以外の場合は失敗しますが、私は同じことをするためにPythonの方法を見つけたいと思います。ここでPythonの愛好家が私を助けることができますか?

答えて

2

tcl string mapに最も近いのはstr.translateですが、残念ながら1文字しかマッピングできません。したがって、コンパクトな例を得るためには正規表現を使用する必要があります。これはlook-behind/look-ahead assertionsで行うことができますが、\r年代は、最初に交換することがあります。

import re 

oldtext = """\ 
This would keep paragraphs separated. 
This would keep paragraphs separated. 

This would keep paragraphs separated. 
\tThis would keep paragraphs separated. 

\rWhen, in the course 
of human events, 
it becomes necessary 
\rfor one people 
""" 

newtext = re.sub(r'(?<!\n)\n(?![\n\t])', ' ', oldtext.replace('\r', '')) 

出力:

This would keep paragraphs separated. This would keep paragraphs separated. 

This would keep paragraphs separated. 
    This would keep paragraphs separated. 

When, in the course of human events, it becomes necessary for one people 

私はこれはしかし、TCLコードほど効率的であるかどうかを疑います。

UPDATE

私はこのProject Gutenberg EBook of War and Peace(プレーンテキストUTF-8、3.1メガバイト)を使用して、少しテストをしました。

set fp [open "gutenberg.txt" r] 
set oldtext [read $fp] 
close $fp 

set newtext [string map "{\r} {} {\n\n} {\n\n} {\n\t} {\n\t} {\n} { }" $oldtext] 

puts $newtext 

と私のpythonと同等:

import re 

with open('gutenberg.txt') as stream: 
    oldtext = stream.read() 

    newtext = re.sub(r'(?<!\n)\n(?![\n\t])', ' ', oldtext.replace('\r', '')) 

    print(newtext) 

原油性能試験:

$ /usr/bin/time -f '%E' tclsh gutenberg.tcl > output1.txt 
0:00.18 
$ /usr/bin/time -f '%E' python gutenberg.py > output2.txt 
0:00.30 

ので、予想通り、TCLバージョンは、より効率的であるここに私のTCLスクリプトです。しかし、Pythonのバージョンからの出力はややクリーナーです(行頭に余分なスペースは挿入されません)。 「人間イベントNOFコース\には、\ nは1人Nforの\必要になった場合、」 >>> whenin = >>> 再インポート>>>:

いくつかの改行を処分した
+0

あなたのコードには末尾に余分な括弧が付いています。これは構文エラーですが、余分な括弧を削除してもうまくいきました。また、 '\ r'と' \ n'を取り除く必要があることを思い出しました。私はこれをProject Gutenbergの巨大なテキストファイルを使ってTclコードと比較して時間テストを実行するために、他の人に任せておきます。 :o) – McClamrock

+0

私はちょうど思い出しました。 。 。私は '\ r'も覚えていましたが、そうでした。 – McClamrock

+0

@McClamrock。私のサンプルコードを修正しました:ありがとう。私はいくつかのタイミングを取ってもいいかもしれませんが、最初に少しtclを学ぶ必要があります;-) – ekhumoro

2

あなたは先読み検索で正規表現を使用することができます。改行やスペースとタブが続いていない任意の新しい行を置き換えます

import re 

text = """ 
... 
""" 

newtext = re.sub(r"\n(?=[^\n\t])", " ", text) 

私はこれをしたいとき、私は次のスクリプトを使用し
+0

、すべてではありません人間事象の過程で\ nitが必要になったときにnewtext = re.sub(r "\ b \ n \ b"、 ""、when) カンマの後に1つ? – McClamrock

+0

@McClamrock:私は自分の答えを変えました。 – zondo

+0

それはもっと似ています - 今はうまくいきます。 :o) – McClamrock

2

import sys 
import os 

filename, extension = os.path.splitext(sys.argv[1]) 

with open(filename+extension, encoding='utf-8-sig') as (file 
), open(filename+"_unwrapped"+extension, 'w', encoding='utf-8-sig') as (output 
): 
    *lines, last = list(file) 
    for line in lines: 
     if line == "\n": 
      line = "\n\n" 
     elif line[0] == "\t": 
      line = "\n" + line[:-1] + " " 
     else: 
      line = line[:-1] + " " 
     output.write(line) 
    output.write(last) 
  • のみ改行と「空白」の行は、前の行から取り除か1を交換するために2つのラインフィード(変身)。これは2つの改行で段落を区切るファイルを処理します。
  • タブで始まる行は、先頭の改行(前の行から削除されたものを置き換える)を取得し、後続の改行をスペースで置き換えます。これは、段落をタブ文字で区切ったファイルを処理します。
  • 空白でもタブでも始まって​​いない行は、後続の改行がスペースで置き換えられます。
  • ファイルの最後の行に改行コードがない場合があります。そのため、直接コピーされます。
+0

印象的なスクリプトですが、1行のコードでその仕事をしません! :o) – McClamrock

関連する問題