2

現在のディレクトリ内のすべてのファイルの文字列を置き換えようとしています。何らかの理由で、一時ファイルが空白になります。secondfile がそのスコープ外で宣言されたため、.write が機能していないようです。私はPythonを初めて使用するので、まだ学習曲線を上っています...ありがとう!

編集:一時ファイルが現在コピーされていないことは承知しています。また、これを行うためのはるかに効率的な方法があることも認識しています。練習でこんな感じにしています。ここで .write メソッドが機能しない理由を誰かが具体的に答えることができれば、それは素晴らしいことです。ありがとう!

import os
import shutil


for filename in os.listdir("."):
    file1 = open(filename,'r')  
    secondfile = open("temp.out",'w')
    print filename
    for line in file1:
        line2 = line.replace('mrddb2.','shpdb2.')
        line3 = line2.replace('MRDDB2.','SHPDB2.')
        secondfile.write(line3)
    print 'file copy in progress'
    file1.close()
    secondfile.close()
4

8 に答える 8

5

一見すると、問題は「w」にあるようです。

追加ではなく、上書きを続けているようです。

つまり、基本的にファイルをループしており
、最終的には最後のファイルを一時ファイルにコピーしただけです。

'w' の代わりに 'a' でファイルを開くことができます。

于 2009-06-11T23:26:46.307 に答える
0

file.writeの後にfile.closeがないと、ファイルに出力されない場合があることに気付きました。

たとえば、このプログラムは実際にファイルに保存することはなく、空白のファイルを作成するだけです(outfile.writeの直後にoutfile.close()を追加しない限り)。

outfile=open("ok.txt","w")

fc="filecontents"

outfile.write(fc.encode("utf-8"))


while 1:

    print "working..."
于 2009-07-11T00:08:18.223 に答える
0

まず、

一時ファイルを元のファイルにコピーするのを忘れています。

第二に:

python の代わりに sed -i または perl -i を使用してください。

例えば:

perl -i -pe 's/mrddb2/shpdb2/;s/MRDDB2/SHPDB2/' *
于 2009-06-11T23:03:28.373 に答える
0

@OP、 fileinput モジュールを試してみることもできます(この方法では、独自の一時ファイルを使用する必要はありません)

import fileinput
for filename in os.listdir("."):
    for line in fileinput.FileInput(filename,inplace=1):
        line = line.strip().replace('mrddb2.','shpdb2.')
        line = line.strip().replace('MRDDB2.','SHPDB2.')
        print line

ファイルをその場で編集するには、「inplace」を 1 に設定します。stdout への通常の出力の場合は 0 に設定します

于 2009-07-11T00:17:16.547 に答える
0

投稿に示されているようにコードが実際にインデントされている場合、書き込みは正常に機能しています。しかし、失敗している場合は、書き込み呼び出しが内側の for ループの外にある可能性があります。

于 2009-06-11T23:49:54.487 に答える
0

本当に何かが欠けていないことを確認するために、コードをテストしたところ、問題なく動作しました。おそらく、1 つの特定のファイル名を除いてすべてを続行し、その後 temp.out の内容を確認することができます。

import os

for filename in os.listdir("."):
    if filename != 'findme.txt': continue
    print 'Processing', filename
    file1 = open(filename,'r')
    secondfile = open("temp.out",'w')
    print filename
    for line in file1:
        line2 = line.replace('mrddb2.','shpdb2.')
        line3 = line2.replace('MRDDB2.','SHPDB2.')
        print 'About to write:', line3
        secondfile.write(line3)
    print 'Done with', filename
    file1.close()
    secondfile.close()

また、他の人が述べたように、新しいファイルを処理するたびに temp.out ファイルを壊しているだけです。また、実際には何もせずに shutil をインポートしました。temp.out を元のファイルにコピーするのを忘れていませんか?

于 2009-06-11T23:53:30.780 に答える