Как избежать создания файлов с нулевым байтом при закрытии файла python в режиме "w" из-за ошибки?

50
5

Я использую Python 3.4.1 64bit в Windows 7. Это не имеет значения для вопроса, AFAICS, но я включил информацию на всякий случай. Вот соответствующая часть моего кода:

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 не удалось - из-за опечатки). Когда я проверил каталог, в котором он был сохранен после, я обнаружил кучу файлов с ожидаемыми именами файлов, но с нулевым байтом. Это имеет смысл, поскольку ничего не написано.

Я пытаюсь понять, почему предположение в этом случае состоит в том, чтобы сделать прикосновение и создать файл в любом случае, а не делать это. Что еще более важно, могу ли я отключить это поведение прикосновений, чтобы никакие файлы не были созданы при закрытии? Не хватает ли я лучшего способа сделать это, чтобы полностью обойти проблему?

спросил(а) 2014-07-28T00:08:00+04:00 5 лет, 7 месяцев назад
1
Решение
72

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

ответил(а) 2014-07-28T00:11:00+04:00 5 лет, 7 месяцев назад
62

Вы можете использовать два подхода.


Удалите файл, когда ваш код входит в блок исключений, это означает, что есть ошибка, и вам не нужен нулевой размер файла.

Используйте строку для сохранения значения из прочитанного URL. Только напишите строку в файл, когда чтение URL-адреса будет успешным. Это лучший подход.

ответил(а) 2014-07-28T00:15:00+04:00 5 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема