С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/63: Рейтинг темы: голосов - 63, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 05.06.2019
Сообщений: 1

Задача из книги "A Byte of Python"

05.06.2019, 19:01. Показов 12562. Ответов 10

Студворк — интернет-сервис помощи студентам
Здравствуйте. Возник ряд вопросов по заданию из книги. Вот задание:

Наиболее важным усовершенствованием было бы прекращение использования
os.system для создания архивов, а применение вместо него встроенных модулей
zipfile или tarfile. Они являются частью стандартной библиотеки, поэтому всегда доступны для использования без зависимости от внешней программы zip на компьютере.
В приведённых примерах мы использовали способ с os.system для создания резервных
копий исключительно в педагогических целях, чтобы пример был достаточно прост для
понимания любым читателем, но достаточно реален для того, чтобы делать что-то полезное.
Попробуйте написать пятую версию с использованием модуля zipfile вместо вызова
os.system

Вот код из книги:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import os
import time
 
# 1. Файлы и каталоги, которые необходимо скопировать, собираются в список.
source = ['"C:\\My Documents"', 'C:\\Code']
# Заметьте, что для имён, содержащих пробелы, необходимо использовать
# двойные кавычки внутри строки.
 
# 2. Резервные копии должны храниться в основном каталоге резерва.
target_dir = 'D:\\Backup' # Подставьте тот путь, который вы будете использовать.
 
# 3. Файлы помещаются в zip-архив.
# 4. Текущая дата служит именем подкаталога в основном каталоге
today = target_dir + os.sep + time.strftime('%Y%m%d')
 
# Текущее время служит именем zip-архива
now = time.strftime('%H%M%S')
 
# Запрашиваем комментарий пользователя для имени файла
comment = input('Введите комментарий --> ')
if len(comment) == 0: # проверяем, введён ли комментарий
    target = today + os.sep + now + '.zip'
else:
    target = today + os.sep + now + '_' + \
        comment.replace(' ', '_') + '.zip'
 
# Создаём каталог, если его ещё нет
if not os.path.exists(today):
    os.mkdir(today) # создание каталога
print('Каталог успешно создан', today)
 
# 5. Используем команду "zip" для помещения файлов в zip-архив
zip_command = "zip -qr {0} {1}".format(target, ' '.join(source))
 
# Запускаем создание резервной копии
if os.system(zip_command) == 0:
    print('Резервная копия успешно создана в', target)
else:
    print('Создание резервной копии НЕ УДАЛОСЬ')
Вопрос простой - как это сделать?
Пример решения задачи для меня важен, я смогу прогуглить каждую строку и понять, что за что отвечает и для чего это нужно. Но также, я бы хотел получить рекомендации по самостоятельному поиску решения задач в принципе. Я понимаю, что мне нужно прогуглить модуль Zipfile, но как в нём найти нужные для меня функции? (функции ведь? Немного путаюсь в терминах) Очень полезным для меня будет критика в плане построения вопроса. Программирование мне даётся сложно, учу всё пока сам, поэтому хотелось бы узнать что-то от профессионалов. Спасибо заранее за ответ!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.06.2019, 19:01
Ответы с готовыми решениями:

Задача из книги A byte of python
def reverse(text): return text def is_palindrome(text): return text == reverse(text) something = input('Введите текст:...

Цикл из книги A Byte of Python
Есть простенький пример в данном учебнике, привожу "один в один": while True: s = input('Enter somthing: ') if s == 'exit': ...

Проблемы с первой задачей из книги ''A Byte of Python''
По какой-то причине не работает код из книги ''A Byte of Python''. Ребзя, можете помочь? Выдаёт такую ошибку: "Создание резервной...

10
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,301
05.06.2019, 22:26
Вот тут справка https://docs.python.org/3/library/zipfile.html, там и примеры кода
0
1 / 1 / 0
Регистрация: 22.06.2019
Сообщений: 6
22.06.2019, 09:39
Конечно , ты должен понимать что делает каждая строка .. соответсвенно ты должен гуглить хотя бы по названию модуля .. ну и гугль выводит как раз на ту ссылку которую дали выше .. ну а там расписаны все функции и методы этого модуля .. просто вруби ереводчик на гугл хроме .. и читай вчитывайся .. либо ищи раъяснения по каждому конкретному методу .. опять же в гугле/яндексе
0
1 / 1 / 0
Регистрация: 01.10.2018
Сообщений: 15
22.06.2019, 10:25
Для того что бы посмотреть все имена методов (они же функции) содержащиеся в модуле, то
узнать их можно в документации, как предложил tooru и pyrogrammer

Или заходишь в интерпретатор командой python3.7 (версию указываешь свою)
далее импортируешь нужный модуль, к примеру import zipfile
далее вводишь dir(zipfile) или help(zipfile)
0
0 / 0 / 0
Регистрация: 08.11.2019
Сообщений: 1
08.11.2019, 14:38
ВСЕМ привет.
Я тоже новичок и тоже пытаюсь освоить Python как язык программирования. Это вообще новая для меня сфера деятельности.
В принятом мною призыве автора книги "Попробовать написать пятую версию с использованием модуля zipfile вместо вызова
os.system" я продвинулся до успешного создания каталога, но, увы, пустого - без файлов.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import os
import zipfile
import time
# 1. Файлы и каталоги, которые необходимо скопировать, собираются в список.
source = ['"D:окументыайл один.xls"',
          '"D:\_Работаапросы ОТ насайл два.xls"',
          '"D:\_Работа\Forexайл три.xls"']
# Заметьте, что для имён, содержащих пробелы, необходимо использовать
# двойные кавычки внутри строки.
# 2. Резервные копии должны храниться в основном каталоге резерва.
target_dir = 'D:\\Backup_3files' # Подставьте тот путь, который вы будете использовать.
# 3. Файлы помещаются в zip-архив.
# 4. Текущая дата служит именем подкаталога в основном каталоге
today = target_dir + os.sep + time.strftime('%Y%m%d')
# Текущее время служит именем zip-архива
now = time.strftime('%H%M%S')
# Запрашиваем комментарий пользователя для имени файла
comment = input('Введите комментарий --> ')
if len(comment) == 0: # проверяем, введён ли комментарий
    target = today + os.sep + now + '.zip'
else:
    target = today + os.sep + now + '_' + \
        comment.replace(' ', '_') + '.zip'
# Создаём каталог, если его ещё нет
if not os.path.exists(today):
    os.mkdir(today) # создание каталога
print('Каталог УСПЕШНО создан', today)
# 5. Используем модуль "zipfile" для помещения файлов в zip-архив
newzip = zipfile.ZipFile(target, 'w', zipfile.ZIP_DEFLATED)
# Закрываем архив
newzip.close()
# Запускаем создание резервной копии
[U]if newzip == 0:[/U]
    print('Резервная копия успешно создана в', target)
else:
    print('Создание резервной копии НЕ УДАЛОСЬ')
Тред выше был мною прочитан, но хотел бы попросить, если это возможно, указать вектор в котором необходимо двигаться, чтобы эти файлы были успешно записаны в архив (проблемную строчку подчеркнул).. тут кода-то осталось на 1 строчку имхо
0
0 / 0 / 0
Регистрация: 01.03.2020
Сообщений: 1
01.03.2020, 20:56
Привет. Два дня изучаю питон. Как зиповать файлы рил написано в документации к модулю. Но вот с модулем os разобраться сложнее, там я больше копипастил. На правильность не пертендую, но это работает
Python
1
2
3
4
5
6
7
8
9
10
11
12
import zipfile
 
...
 
    print('Каталог успешно создан', today)
# Cоздаём объект зип. Первый параметр это наше имя+коммент, второй параметр указывает возможность записи
z = zipfile.ZipFile(target, 'w')
# Используем функцию os.walk через интерацию for для нахождения всех файлов
for folder, subfolder, files in os.walk(source):
    for file in files:
             # Метод write инициирует запись. До конца не разобрался зачем нужен метод relpath, но без него не зипует в целевую папку переменной target_dir.
            z.write(os.path.join(folder, file), os.path.relpath(os.path.join(folder, file), target_dir))
Вообще, оказывается, надо шарить в куче модулей. Новички, как и я, если вы это читаете, всё не так просто, как кажется
0
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 1
04.05.2020, 15:33
Вообще не претендую на правильность своей проги,т.к. только начал учится, но решил задачу таким образом:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import os
import time
from zipfile import ZipFile
 
def get_all_file_paths(directory): #На каждой итерации все файлы в этом каталоге добавляются в список с именем file_paths.
  
    file_paths = [] 
 
    for root, directories, files in os.walk(directory): 
        for filename in files: 
            filepath = os.path.join(root, filename) 
            file_paths.append(filepath) 
  
    return file_paths         
  
target_dir = "E:\\DePython\\backup" # Тут определяем дерикторию для резервной копии
 
today = target_dir + os.sep + time.strftime('%Y%m%d')
now = time.strftime ('%H%M%S')
 
comment = input ("Enter a comment for the directory: ")# Запрос комментария пользователя
if len(comment) == 0:
    target = today + os.sep + now + '.zip'
else:
    target = today + os.sep + now + "_" + comment.replace(' ','_') + '.zip'
 
if  not os.path.exists(today): # проверяем существует ли каталог 
    os.mkdir(today) # Создание каталога
    print ('Directory successfully created', today)
 
def main(): 
    directory = 'E:\\DePython\\ImportantFiles'
    file_paths = get_all_file_paths(directory) 
      with ZipFile(target,'w') as zip: 
        for file in file_paths: 
            zip.write(file) # Здесь мы записываем все файлы в zip-файл один за другим, используя метод .write
  
    print('All files zipped successfully!')         
 
if __name__ == "__main__": 
    main()
0
0 / 0 / 0
Регистрация: 24.07.2020
Сообщений: 1
24.07.2020, 08:58
Тоже втупил именно на этой задаче, и через полтора дня разбираний пришел к такому результату. Прога рабочая, правда не до конца понимаю "os.path.join(folder, file)".
Python
1
2
3
4
5
6
7
8
9
10
11
12
import zipfile
 
.....
 
print('Каталог успешно создан', today)
# Создаю пустой архив
myzip = zipfile.ZipFile(target, 'w')
# Добавляю в архив файлы, которые необходимо заархивировать
for a in source:
    for folder, subfolders, files in os.walk(a):
        for file in files:
            myzip.write(os.path.join(folder, file))
0
0 / 0 / 0
Регистрация: 28.09.2018
Сообщений: 5
27.11.2020, 01:03
Сделал после гугления и на основе 4го варианта

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import os
from zipfile import ZipFile
import zipfile
import time
 
# 1. Файлы и каталоги, которые необходимо скопировать, собираются в список.
sources = ["C:\\Путь\\к\\папке", "C:\\Путь\\к\\другой\\папке"]
# Заметьте, что для имён, содержащих пробелы, необходимо использовать
# двойные кавычки внутри строки.ggg
 
# 2. Резервные копии должны храниться в основном каталоге резерва.
target_dir = 'E:\\Путь\\к\\папке\\с\\бэкапом'  # Подставьте ваш путь.
# 3. Файлы помещаются в zip-архив
# 4. Текущая дата служит именем подкаталога в основном каталоге
today = target_dir + os.sep + time.strftime('%Y%m%d')
# Текущее время служит именем zip-архива
now = time.strftime('%H%M%S')
 
# Создаём каталог, если его ещё нет
if not os.path.exists(today):
    os.mkdir(today)  # создание каталога
    print('Каталог успешно создан', today)
# Запрашиваем комментарий пользователя для имени файла
comment = input('Введите комментарий --> ')
if len(comment) == 0:  # проверяем, введён ли комментарий
    target = today + os.sep + now + '.zip'
else:
    target = today + os.sep + now + '_' + \
             comment.replace(' ', '_') + '.zip'
def zipit(sources):
    zip_file = ZipFile(target, 'w', zipfile.ZIP_DEFLATED)
    for source in sources:
        for folderName, subfolders, filenames in os.walk(source):
            for filename in filenames:
                filePath = os.path.join(folderName, filename)
                filePathRel = os.path.relpath(filePath, os.path.join(sources[0], '../..'))
                zip_file.write(filePath, filePathRel)
 
# Запускаем создание резервной копии
 
zipit(sources)
if os.system(target) == 0:
    print('Резервная копия успешно создана в', target)
else:
    print('Создание резервной копии НЕ УДАЛОСЬ')
0
Модератор
Эксперт 1С
 Аватар для Dethmontt
4032 / 2977 / 594
Регистрация: 10.03.2011
Сообщений: 11,703
Записей в блоге: 1
27.11.2020, 07:04
Цитата Сообщение от Buckzor Посмотреть сообщение
os.path.join(folder, file)".
джоин = соединить
"С:\тест"+"\мой файл.txt"

Добавлено через 5 минут
Было бы интереснее посмотреть реализацию совсем без использования библиотеки OS
0
0 / 0 / 0
Регистрация: 28.09.2018
Сообщений: 5
27.11.2020, 11:29
Как я понимаю у автора книги не стоял вопрос в избавлении от os., а лишь только в отказе от использования внешнего зиппера. Os это стандартная библиотека.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.11.2020, 11:29
Помогаю со студенческими работами здесь

Проблема с бекапом файлов на примере книги Byte of Python
Добрый вечер, дорогие форумчане, возник вопрос: что я делаю не так? Переписал код по книге Swaroop'a, установил gnuwin32(на 10 windows),...

Проблема с решением задачи из книги "byte of python"
Добрый день, помогите с решением проблемы. Изучаю Python по книге "byte of python", столкнулся с такой проблемой, что при решение задачи по...

Задача из книги "Начинаем программировать на Python, Тони Геддис"
Никак не могу решить задача, пожалуйста, помогите, очень хочу ее разобрать.

Нельзя преобразовать тип function(a: byte;b: byte): byte к integer (Списки)
Создать список из целых чисел.Поменять в списке местами максимальный и минимальный элементы Проблемы c процедурами Pos и Chang: пос...

A Byte of Python
print ("Hello world!") Ребята! Помогите разобраться с "class" второй день над примером мучаюсь PyCharm выдает ошибку: in...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru