Как избежать создания файлов с нулевым байтом при закрытии файла python в режиме "w" из-за ошибки?
Я использую 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 не удалось - из-за опечатки). Когда я проверил каталог, в котором он был сохранен после, я обнаружил кучу файлов с ожидаемыми именами файлов, но с нулевым байтом. Это имеет смысл, поскольку ничего не написано.
Я пытаюсь понять, почему предположение в этом случае состоит в том, чтобы сделать прикосновение и создать файл в любом случае, а не делать это. Что еще более важно, могу ли я отключить это поведение прикосновений, чтобы никакие файлы не были созданы при закрытии? Не хватает ли я лучшего способа сделать это, чтобы полностью обойти проблему?
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
Вы можете использовать два подхода.
Удалите файл, когда ваш код входит в блок исключений, это означает, что есть ошибка, и вам не нужен нулевой размер файла.
Используйте строку для сохранения значения из прочитанного URL. Только напишите строку в файл, когда чтение URL-адреса будет успешным. Это лучший подход.
- Вопросы
- Python-3.4
- Как избежать создания файлов с нулевым байтом при закрытии файла python в режиме "w" из-за ошибки?