0

うまくいけば、私は正しい答えを見落としていませんが... foo barのテーマに合わせて。次のようなファイルがあるとします。

blah boo who
bar blah blah
bar blah blah
foo some other chars
bar blah
black sheep

次のことを知らなくても、で始まるまたは含む行'foo'を置き換えて、行全体を置き換えられるようにしたいと考えています。

私の現在のコードは厄介ですが、機能します。ファイルをロードせずにループする方法はありますか? または少なくともこれよりも効率的に?

filein = open("file", "r")
fileout = open("file.tmp", "w")
for line in filein:
    if line.startswith("foo"):
        fileout.write( "foo"+"my new numbers")
    else:
        fileout.write( line.replace('', '') )
filein.close()
fileout.close()
os.rename("file.tmp", "file")
4

4 に答える 4

1

正規表現に問題がなく、ファイルがメモリに収まる場合、これは機能するはずです。

file = open("file", "r")
data = file.read()
file.close()
data = re.sub(re.compile("^(.*)(foo)(.*)$",re.MULTILINE),'foo my new numbers',data)
file = open("file1", "w")
file.write(data)
file.close()
于 2012-07-04T12:19:52.130 に答える
1
from fileinput import FileInput
with FileInput(files="file", inplace=True) as f:
    for line in f:
        if "foo" in line:
            line = "foo"+"my new numbers"+"\n"
        print(line, end='')
于 2012-07-04T11:20:38.307 に答える
0

その他のオプション:text.split()の「foo」の場合または:re.sub(r'foo \ b'、text)の場合

于 2012-07-04T11:30:19.373 に答える
0

はるかに短いコードは次のようになります。

import os
with open('file') as f1,open('file.tmp','w') as f2:
    lines=[x if 'foo' not in x.split() else "foo my new numbers\n" for x in f1]
    f2.writelines(lines)
os.rename("file.tmp", "file")           

またはファイルが巨大な場合:

import os
with open('data1.txt') as f1,open('file.tmp','w') as f2:
    for x in f1:
        if 'foo' in x.split():
            f2.write("foo my new numbers\n")
        else:
            f2.write(x)
os.rename("file.tmp", "file") 
于 2012-07-04T11:17:51.723 に答える