2016-04-11 5 views
1

私は、テキスト文書内の記号{}の間のすべてを見つけるスクリプトを作ろうとしています。それは{}内の.txtドキュメント固有の部分を取り、それをアルファベット順に整理し、それをテキスト文書に戻して書き戻します。テキスト文書の例...(アルファベット順にソート)リストを整理してファイルに書き戻す

bla bla bla 
bla ba bl bla ba bl {apple:banana, this: something else, airplane:hobby} 
bla bla bla 
bla bla bla 

所望の出力..

bla bla bla 
bla ba bl bla ba bl {airplane:hobby, apple:banana, this: something else} 
bla bla bla 
bla bla bla 

何その、まだ印刷...

bla bla bla 
    bla ba bl bla ba bl {apple:banana, this: something else, airplane:hobby} 
    bla bla bla 
    bla bla bla 

私のコード..

def openFind(): 
    f = open(inFile, 'r') 
    lines = f.read() 
    match = re.findall(r'{(.*?)}', lines) 
    before = str(match) 
    n=1 
    for i in xrange(0, len(match), n): 
     mydict = match[i:i+n] 
     for x in sorted(mydict): 
      c = x.split(',') 
      newmatch = sorted(c) 
      final = str(newmatch) 
      print final 

      # NOT WORKING BELOW!!! Stuck in loop? 
      with open(outFile,'w') as new_file: 
       with open(inFile) as old_file: 
        for line in old_file: 
         new_file.write(line.replace(before, after)) 

ソート順/アルファベット順リストを[飛行機:趣味、リンゴ:バナナ、これは別のものですが、テキスト文書の元のテキストを置き換えるにはどうしたらいいですか?インプレースにする必要がありますが、新しいtxtを作成することができます。

+2

あなたは(http://stackoverflow.com/questions/4719438/editing-specific-line-in- [この]のような何かを探していますtext-file-in-python) – idjaw

+0

Iveはfileinput関数を試しましたが、それは私のテキストを大幅に変更します – Anekdotin

+0

その入力の出力はどれくらいですか? – Francesco

答えて

2

この動作するはずです:

import re 

def openFind(): 
    with open("test.txt", "r") as in_file: 
     data = in_file.read() 

    def sub(m): 
     l = [s.strip() for s in m.group(1).split(",")] 
     l.sort() 
     return "{%s}" % (", ".join(l),) 

    replacement = re.sub(r'{(.*?)}', sub, data) 
    with open("out.txt", "w") as out_file: 
     out_file.write(replacement) 

私はその場でソートされた試合で置き換えるためにre.sub()を使用していました。

+0

感心しました。いい仕事! – Anekdotin

1

次のコードは、{ & }間でアイテムを並べ替えると、同じファイルに結果を書き込みます:

import re 

with open('test.txt', 'r+') as f: 
    s = f.read() 
    r = list(s) 
    for mo in re.finditer('{(.*?)}', s): 
     d = sorted(mo.group(1).split(', ')) 
     r[mo.start(1):mo.end(1)] = list(', '.join(d)) 

    f.seek(0) 
    f.write(''.join(r)) 
1

私はバラバラにこの問題にアプローチします。まず、あるファイルから読み込み、新しいファイルに書き込むことができるようにします。あなたはこれを多数の方法で行うことができます。ファイルが小さい場合は、readlines()を使用して元のファイルを切り捨ててから書き戻してください。

しかし、の巨大なファイル(RAM /スワップスペースに簡単に収まるサイズよりも大きい、現在は数GBのサイズ)の可能性を想定します。

import os 
import tempfile 

with tempfile.NamedTemporaryFile(delete=False) as temp: 
    with open(filename) as infile: 
     for line in infile: 
      temp.write(line) 
    os.unlink(infile) 
    os.rename(temp.name, infile.name) 

ここでは、各行を読んで宛先に書き出します。今、あなたがする必要があるすべてはライン切片であり、それが必要かどうそれを変更します。

for line in infile: 
    match = re.search('{{.*?}}') 
    if match: 
      # Assumes you only have one "dictionary" per line 
      first_part, rest = line.split('{', maxsplit=1) 
      # allows for trailing data 
      data, last_part = rest.split('}', maxsplit=1) 
      data = [_.split(':') for _ in data.split(',')] 
      data.sort() 
      line = '{}{{{}}}{}'.format(first_part, ', '.join(':'.join(_) for _ in data)) 
    temp.write(line) 

あなたは厳密なアルゴリズムを微調整する必要があるかもしれませんが、それはこのような問題に直面したとき、私はかかるだろうなアプローチです。

次のようにプログラム全体を簡潔に記述することができ
1

with open("file.txt") as fr: 
    content = fr.read() 

matches = (match.group(1) for match in re.finditer(r"{(.*?)}", content)) 
for match in matches: 
    repl = ", ".join(sorted(match.split(", "))) 
    content = content.replace(match, repl) 

with open("file.txt", "w") as f: 
    fw.write(content) 
関連する問題