2

这是我的代码:

# 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

4 回答 4

3

我相信您总是在创建文件。因此,您不会看到没有异常的文件。将 write 或 file open write 置于 try except 下并没有什么坏处,因为您可能没有创建文件的权限。

我发现使用诸如 try except 和 else 之类的语句来测试 Python 命令行中的语句,这是解决驾驶舱错误的一个非常好的地方,而且我在证明一个概念时产生大量驾驶舱错误方面经验丰富。

您使用 try except 的事实非常好。我只需要回顾一下当逻辑流通过其中一个时会发生什么。命令行是执行此操作的好地方。

于 2012-04-18T12:25:09.157 回答
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 的答案。我的方法有效,但不是最好的方法,我会留待解释。


老答案:

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

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)

由于我们只有写入文件(覆盖现有内容)和追加(最后)的选择,我们需要构建一种预先添加数据的方法。我们可以通过读取内容(同时方便地检查文件是否存在)然后写入标题和内容来做到这一点(这里我添加了一个换行符以提高可读性)。

于 2012-04-18T12:30:08.620 回答
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")
于 2012-04-18T12:41:49.487 回答
-1

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

于 2012-04-18T12:42:24.233 回答