web-dev-qa-db-ja.com

pythonでテキストファイルが存在し、空ではないことを確認する方法

Pythonでテキストファイルを読み取るスクリプトを作成しました。

これがコードです。

parser = argparse.ArgumentParser(description='script')    
parser.add_argument('-in', required=True, help='input file',
type=argparse.FileType('r'))
parser.add_argument('-out', required=True, help='outputfile',
type=argparse.FileType('w'))     
args = parser.parse_args()    

try:
    reader = csv.reader(args.in)
    for row in reader:
        print "good"
except csv.Error as e:
    sys.exit('file %s, line %d: %s' % (args.in, reader.line_num, e))

for ln in args.in:
    a, b = ln.rstrip().split(':')

ファイルが存在し、空のファイルではないかどうかを確認したいのですが、このコードでエラーが発生します。

また、プログラムが出力ファイルに書き込めるかどうかを確認したいと思います。

コマンド:

python script.py -in file1.txt -out file2.txt 

エラー:

good
Traceback (most recent call last):
  File "scritp.py", line 80, in <module>
    first_cluster = clusters[0]
IndexError: list index out of range
21
user3573959

ファイルが存在し、空ではないかどうかを確認するには、 _os.path.exists_ と-の組み合わせを呼び出す必要があります _os.path.getsize_ 「and」条件付き。例えば:

_import os
my_path = "/path/to/file"

if os.path.exists(my_path) and os.path.getsize(my_path) > 0:
    # Non empty file exists
    # ... your code ...
else:
    # ... your code for else case ...
_

alternativeとして、 _try/except_とともに_os.path.getsize_を使用することもできます(_os.path.exists_)を使用しないでください。これは、ファイルが存在しない場合、またはファイルにアクセスする権限がない場合に OSError を発生させるためです。例えば:

_try:
    if os.path.getsize(my_path) > 0:
        # Non empty file exists
        # ... your code ...
    else:
        # Empty file exists
        # ... your code ...
except OSError as e:
    # File does not exists or is non accessible
    # ... your code ...
_

参考文献Python 3ドキュメント

  • os.path.getsize() は:

    パスのサイズをバイト単位で返します。ファイルが存在しないか、アクセスできない場合は、 OSError を上げます。

    空のファイルの場合、_0_を返します。例えば:

    _>>> import os
    >>> os.path.getsize('README.md')
    0
    _
  • 一方、 os.path.exists(path) は:

    パスが既存のパスまたは開いているファイル記述子を参照している場合は、Trueを返します。壊れたシンボリックリンクに対してFalseを返します。

    一部のプラットフォームでは、パスが物理的に存在していても、要求されたファイルで os.stat() を実行する許可が与えられていない場合、この関数はFalseを返します。

37