如何在Python中检查文本文件是否存在且不为空

36

我用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

请查看此链接:https://dev59.com/2HE95IYBdhLWcg3wkekf - Vinkal
那段代码根本无法解析,in 不是一个有效的标识符(在 args.in 中)。 - Antti Haapala -- Слава Україні
你的代码中出现了 first_cluster = clusters[0] 这段代码吗? - Peter Wood
脚本出现错误是因为 FOR 循环失败了。当它开始读取文件时,无法从 args.in 中读取文件。我该如何使用参数解析器来读取文件呢? - user3573959
4个回答

61

要检查文件是否存在且不为空,您需要使用os.path.existsos.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 ...

作为一种 替代方案,您还可以使用带有os.path.getsizetry/except (而不是使用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


我使用以下代码来检查是否需要下载文件:must_be_downloaded = not os.path.isfile(file_path) or os.path.getsize(file_path) == 0,在Python 3.6中无需使用try/catch即可正常工作。或者使用相反的条件:exists_for_real = os.path.isfile(file_path) and os.path.getsize(file_path) > 0。你可以自己添加更多的条件,但是我只是编写了这个简单的检查,并且在我的情况下它很有效。 - firepol

6

在Python3中,您应该使用pathlib.Path功能来实现此目的:

import pathlib as p
path = p.Path(f)
if path.exists() and path.stat().st_size > 0:
   raise RuntimeError("file exists and is not empty")

如您所见,Path对象包含执行任务所需的所有功能。


2
def exist_and_not_empty(filepath):
    try:
        import pathlib as p
        path = p.Path(filepath)
        if '~' in filepath:
            path = path.expanduser()
        if not path.exists() and path.stat().st_size > 0:
            return False
        return True
    except FileNotFoundError:
        return False

这利用了上述所有建议,考虑到缺少的文件并自动展开波浪线(如果检测到),因此它可以正常工作。


0

你可以尝试这个:

def existandnotempty(fp):
    if not os.path.isfile(fp):
        retun False
    k=0
    with open(fp,'r') as f:
        for l in f:
          k+=len(l)
          if k:
             return False
          k+=1
    return True 

您可以根据需要进行修改。例如,如果您不希望将制表符、空格等计算为“某些内容”,则可以使用 'trim()'。如果您想将仅包含空行的文件视为“空白”,则可以删除 k+=1。以这种形式,任何字符(即使只有CR)都会将您的文件标记为非空。 - Martial P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接