How to check text file exists and is not empty in python

filepath, python, python-3.x

Solution

To check whether file is present and is not empty, you need to call the combination of `os.path.exists` and `os.path.getsize` with the "and" condition. For example:

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 ...

As an alternative, you may also use `try/except` with the `os.path.getsize` (without using `os.path.exists`) because it raises `OSError` if the file does not exist or if you do not have the permission to access the file. For example:

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 ...

References from the Python 3 document

`os.path.getsize()` will:

Return the size, in bytes, of path. Raise `OSError` if the file does not exist or is inaccessible.

For empty file, it will return `0`. For example:

>>> import os
>>> os.path.getsize('README.md')
0

whereas `os.path.exists(path)` will:

Return `True` if path refers to an existing path or an open file descriptor. Returns `False` for broken symbolic links.

On some platforms, this function may return `False` if permission is not granted to execute `os.stat()` on the requested file, even if the path physically exists.

Problem

I wrote a script to read text file in python. Here is the code. ``` 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(':') ``` I would like to check if the file exists and is not empty file but this code gives me an error. I would also like to check if program can write to output file. Command: ``` python script.py -in file1.txt -out file2.txt ``` ERROR: ``` good Traceback (most recent call last): File "scritp.py", line 80, in <module> first_cluster = clusters[0] IndexError: list index out of range ```

Original source

Related problems