检查文件是否存在失败

时间:2012-04-18 12:11:55

标签: python file-io

这是我的代码:

# header.py

def add_header(filename):
    header = '"""\nName of Project"""'
    try:
        f = open(filename, 'w')
    except IOError:
        print "Sorry could not open file, please check path"
    else:
        with f:
            f.seek(0,0)
            f.write(header)
        print "Header added to", filename

if __name__ == "__main__":
    filename = raw_input("Please provide path to file: ")
    add_header(filename)

当我运行这个脚本时(通过执行python header.py),即使我提供了一个不存在的文件名,它也不会返回函数中的消息。即使用return语句替换print语句,它也不返回任何内容。如何在函数中显示消息?

4 个答案:

答案 0 :(得分:3)

我相信你总是在创建文件。因此,您不会看到没有异常的文件。在try下放置写入或文件打开写入没有什么坏处,因为您可能没有权限创建该文件。

我找到了像try之类的语句,而不是在Python命令行测试那些,这是一个非常好的地方来解决驾驶舱错误,而且我在验证时产生很多驾驶舱错误非常有经验一个概念。

你正在使用的事实除了非常好。我只需要回顾一下当逻辑流程通过其中一个时会发生什么。命令行是一个很好的地方。

答案 1 :(得分:3)

这里的正确做法是尝试读取文件,如果有效,请读取数据,然后使用新数据写入文件。

如果文件不存在,写入文件将创建该文件,并覆盖现有内容。

我还注意到你以奇怪的方式使用with语句,考虑:

try:
    with open(filename, 'w') as f:
        f.seek(0,0)
        f.write(header)
    print("Header added to", filename)
except IOError:
    print("Sorry could not open file, please check path")

这种方式更具可读性。

要了解如何以最佳方式执行此操作,请参阅user1313312's answer。我的方法有效,但不是最好的方法,我会把它留给我解释。


旧答案:

现在,为了解决你的问题,你真的想做这样的事情:

def add_header(filename):
    header = '"""\nName of Project"""'
    try:
        with open(filename, 'r') as f:
            data = f.read()
        with open(filename, 'w') as f:
            f.write(header+"\n"+data)
        print("Header added to"+filename)
    except IOError:
        print("Sorry could not open file, please check path")

if __name__ == "__main__":
    filename = raw_input("Please provide path to file: ")
    add_header(filename)

由于我们只能选择写入文件(覆盖现有内容)和追加(最后),因此我们需要构建一种预先添加数据的方法。我们可以通过阅读内容(手动检查文件同时存在),然后写入标题后跟内容(这里我添加了换行符以便于阅读)来实现这一点。

答案 2 :(得分:2)

这是Lattywares解决方案的略微修改版本。由于无法将数据附加到文件的开头,因此将读取整个内容并重新写入包含标题的文件。通过以读/写模式打开文件,我们可以使用相同的文件处理程序执行这两个操作而不释放它。这应该提供一些防止竞争条件的保护。

try:
    with open(filename, 'r+') as f:
        data = f.read()
        f.seek(0,0)
        f.write(header)
        f.write(data)
        #f.truncate() is not needed here as the file will always grow
    print("Header added to", filename)
except IOError:
    print("Sorry, could not open file for reading/writing")

答案 3 :(得分:-1)

此脚本以“w”模式(写入模式)打开文件,这意味着一旦文件不存在,它将被创建。所以没有IOError。