0

行内のテキストを置き換えるために、このメソッドを作成しました。置き換えたい正しいテキストを出力しますが、ファイル内の変更を更新していません。私はPythonにまったく慣れていません。間違いを犯している場所を教えてください。

def regFind(regx, sub_text, file_name):
  c_file = io.StringIO(file_name)
  for line in c_file:
    match = regx.search(line)
    if match:
      replaced_line = re.sub(regx, sub_text, line)
      line = replaced_line
      #print(line)
    yield line

    regx = re.compile(r'^MYTEXT')
    sub_text = 'NewText'
    a_file = open('file.txt').read()
    for line in regFind(regex, sub_text, a_file):
      print(line)
4

3 に答える 3

1

標準ライブラリには、ファイルを「その場で」編集するためのモジュールfileinputがあります。実際には、ファイルをその場で編集するのではなく、出力を一時ファイルに書き込み、一時ファイルの名前を元のファイルに変更します。これにより、すべてがうまくいけば、ファイルがその場で編集されたかのように見えます。例外が発生した場合、または名前変更手順の前にプログラムが停止した場合、元のファイルはそのまま残ります。

import fileinput
import sys
import re

screen = sys.stdout
def regFind(regx, sub_text, filename):
    for line in fileinput.input([filename],
            inplace=True,
            backup='.bak'   # creates a backup of the original file
            ):
        match = regx.search(line)
        if match:
            line = regx.sub(sub_text, line)
        sys.stdout.write(line)
        yield line

# regex = re.compile(r'foo')    
for line in regFind(regex, sub_text, 'file.txt'):
    screen.write(line+'\n')

fileinputsys.stdoutコンソールではなく、一時ファイルに書き込むようにリダイレクトします。コンソールに出力するために、オリジナルsys.stdoutを変数screenに保存し、screen.write代わりにprint.

于 2013-09-17T13:24:10.837 に答える
0

編集これらの行をテキスト ファイルに書き込まないため、コードは機能しません。

また、ファイル内のテキストを置き換えたい場合は、ファイルの内容をコピーする必要があり、ファイルを書き込みモード (ファイル全体を空にする) で開き、変更された内容をファイルに書き込みます。

def regFindAndReplace(regx, sub_text, fileName):
    textFile = open(fileName)
    fileContent = textFile.readlines()
    textFile.close()
    writeFile = open(fileName,'w')
    for line in fileContent:
        # strip removes newline character if line has one, you probably wont need it but it does not do harm either
        line = line.strip()
        match = regx.search(line)
        if match:
            replaced_line = re.sub(regx, sub_text, line)
            line = replaced_line
            #print(line)
        writeFile.write(line+'\n')
        #'\n' is way to create newline character because stripped line has it no longer
    writeFile.close()

f = 'MyFile.txt'
regFindAndReplace(regex, sub_text, f)
于 2013-09-17T12:37:25.630 に答える
0

ファイルへの変更を明示的に書き込む必要があります。たとえば、別のファイルを書き込みモード ( 'w')で開き、.writeメソッドを使用してデータをディスクに書き込みます。

def regFind(regx, sub_text, a_file):
  for line in a_file:
    match = regx.search(line)
    if match:
      replaced_line = re.sub(regx, sub_text, line)
      line = replaced_line
      #print(line)
    yield line

f = open('file.txt')
out = open('result.txt', 'w')
for line in regFind(regex, sub_text, f):
  out.write(line)

(不要なものも削除StringIOし、ファイル全体をメモリにロードするのをやめました.read()

PS別のファイルに書き込む理由は、より安全だからです。その場でファイルを変更することができます。ただし、十分に注意しないと、データが失われる可能性があります。

于 2013-09-17T12:17:24.850 に答える