如何在'w'模式下因错误关闭Python文件时避免生成零字节文件?
我在Windows 7上使用的是64位的Python 3.4.1。虽然这对我现在要讨论的问题应该没什么影响,但我还是把这些信息放上来以防万一。下面是我代码中相关的部分:
def download_and_save(URL_list, filenames, download_dir):
# Process lists
for URL, filename in zip(URL_list, filenames):
# Generate full path name
file_path = download_dir + filename
# Open a local file.
with open(file_path, 'w') as local_file:
# Write whatever is at the URL
try:
local_file.write(urllib.request.urlopen(URL).read())
except urllib.request.URLError as e:
if hasattr(e, 'reason'):
print ("We failed to reach the server...")
print(e.reason)
elif hasattr(e, 'code'):
print("The server couldn\'t fullfill the request...")
print("Error code: ", e.code)
当我运行这段代码时,遇到了一堆错误(因为拼写错误导致的getaddrinfo失败)。之后我检查了保存代码的目录,发现有一堆文件,文件名是我预期的,但文件大小都是零字节。这是有道理的,因为没有写入任何内容。
我想弄明白,为什么在这种情况下会默认创建文件,即使文件是空的,而不是不创建。更重要的是,我能不能关闭这种默认创建文件的行为,这样在关闭时就不会创建任何文件?我是不是漏掉了什么更好的方法,可以完全避免这个问题?
2 个回答
2
你可以采取两种方法。
当你的代码进入异常处理部分时,删除这个文件。这意味着出现了错误,你不想留下一个大小为零的文件。
用一个字符串来存储从网址读取的值。只有在成功读取网址时,才把这个字符串写入文件。这种方法更好。
3
open
函数用于创建文件。如果你不想在出错时创建空文件,可以在收到服务器的响应后再创建文件:
try:
data = urllib.request.urlopen(URL).read()
with open(file_path, 'w') as local_file:
local_file.write(data)
except urllib.request.URLError as e:
# ... exception handling