如何在'w'模式下因错误关闭Python文件时避免生成零字节文件?

1 投票
2 回答
2065 浏览
提问于 2025-04-18 14:58

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

你可以采取两种方法。

  1. 当你的代码进入异常处理部分时,删除这个文件。这意味着出现了错误,你不想留下一个大小为零的文件。

  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

撰写回答