这是我的代码:
# 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语句,它也不返回任何内容。如何在函数中显示消息?
答案 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。