2

fileinputPythonモジュールを使用すると、奇妙な動作が発生します。変更しようとしているファイルにユーザーの読み取りアクセス権がない場合、そのファイルは削除されます。

import fileinput

try:
    for line in fileinput.input('TEST', inplace=1):
        line = line.strip()
        if '/' in line:
            print "PATH: " + line
        else:
            print line
except Exception as e:
    print e

このファイルを実行すると、次のようになります。

$ ls -l
--wxrwxrwx 1 myusername agqt3 0 Feb 25 11:02 TEST
$ python test.py
[Errno 13] Permission denied: 'TEST.bak'
$ ls -l
total 0

ファイルが削除されます。ユーザーを含まない許可ビットの他のすべての組み合わせでも同じことが起こりますrbashcshおよびでこれを再現しましたksh

4

2 に答える 2

1

を使用しているようですinplace=1ので、ファイルは上書きされると予想されます。これが完了すると、.bakファイルが作成され、最初のファイル名が上書きされます。

ただし、初期ファイルを読み取る権限がない(書き込みはできる) ため、バックアップを作成すると空 (または失敗) になり、元のファイルは上書きされます。

インプレースドキュメント から: http://docs.python.org/2/library/fileinput.html#fileinput.FileInput

オプションのインプレース フィルタリング: キーワード引数inplace=1が fileinput.input() または FileInput コンストラクターに渡される場合、ファイルはバックアップ ファイルに移動され、標準出力は入力ファイルに送信されます (バックアップ ファイルと同じ名前が既に存在する場合、サイレントに置き換えられます)。これにより、入力ファイルをその場で書き換えるフィルターを作成できます。バックアップ パラメータが指定されている場合 (通常は backup='.')、バックアップ ファイルの拡張子が指定され、バックアップ ファイルは残ります。デフォルトの拡張子は「.bak」で、出力ファイルを閉じると削除されます。標準入力が読み取られる場合、インプレース フィルタリングは無効になります。

于 2013-02-25T05:25:18.697 に答える
0

のバグのようfileinputです。Python Bug Trackerでそれに関する問題を開くことをお勧めします

于 2013-02-25T05:22:55.590 に答える