Как записать в папку (которая находится там же где и программа на Python) файл? [дубликат]
или создать подкаталог в каталоге расположения исходного кода и создать файл:
file = open(r"test\test.txt", "w") file.close()
Отслеживать
ответ дан 7 мар 2021 в 22:32
997 1 1 золотой знак 3 3 серебряных знака 16 16 бронзовых знаков
Это запись в файл который будет находится в директории самой программы Python Директория_программы\test.txt А надо Директория_программы\Название_папки\test.txt
7 мар 2021 в 22:49
@Pydeb file = open(r»test\test.txt», «w»)
7 мар 2021 в 22:53
А почему бы не в одну строчку. open(‘test.txt’, ‘w’).close()
7 мар 2021 в 23:04
@OPTIMUS PRIME я подумал пожелают записать в файл перед закрытием
7 мар 2021 в 23:16
- python
- python-3.x
-
Важное на Мете
Связанные
Похожие
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как поместить файл в папку?
Здравствуйте. У меня возникла проблема с помещением файла в папку. Я решил написать небольшую интерактивную программку, в которой происходит следующее:
1)Пишем данные которые хотим поместить в файл.
2)Пишем имя и расширение файла.
3)Указываем имя папки в которую сохранить файл с данными.
И вот я не могу поместить новосозданный файл в папку. Прошу вас помочь.
Спасибо.
import os data = input('Введите данные: ') file = input('Введите имя файла в который будут помещены данные: ') expans = input('Введите расширение файла: ') directory = input('Куда вы хотите сохранить файл?:') direc = os.mkdir(directory)#Создаём папку. li = [data]#Помещаем введённые данные в список. f = open(file + '.' + expans, 'a')#Открываем файл с именем и расширением, которые ввели выше. f.write("\nВведённые данные: <>\n\n".format(li[0]))#Записываем данные в файл. f.close()#Закрываем файл.
- Вопрос задан более трёх лет назад
- 4347 просмотров
1 комментарий
Оценить 1 комментарий
Как записать файл в папку python
Иногда также путь указывают с обратными слэшами:
'C:/Users/User/Python/letters.py'
Получение информации о файлах и директориях
Метод getcwd() возвращает путь к текущей рабочей директории в виде строки:
>>> import os >>> os.getcwd() 'C:\\Users\\User\\Python'
С помощью метода os.listdir() можно получить список всех поддиректорий и файлов текущего рабочего каталога, при этом содержимое вложенных папок не отображается:
>>> os.listdir() ['Data', 'lambda_functions.py', 'letters.py', 'os_methods.py', 'passw_generator.py', 'points.py', 'population.py']
Метод os.walk() возвращает генератор, в котором содержится вся информация о рабочем каталоге, включая содержимое всех поддиректорий:
>>> import os >>> my_cwd = os.getcwd() >>> result = os.walk(my_cwd) >>> for i, j, k in result: for file in k: print(file) lambda_functions.py letters.py os_methods.py passw_generator.py points.py population.py books_to_process.txt challenge_data.txt ledger.txt
Много полезных методов содержится в модуле os . path . Так можно извлечь имя файла из полного пути:
>>> os.path.basename(r'C:\Users\User\Python\letters.py') 'letters.py'
А так можно получить путь к директории / файлу, в который не включается собственно поддиректория или имя файла:
>>> os.path.dirname(r'C:\Users\User\Python\Data') 'C:\\Users\\User\\Python'
Метод path . isabs () покажет, является ли путь абсолютным или относительным:
>>> os.path.isabs(r'C:\Users\User\Python\Data') True >>> os.path.isabs(r'.\Python\Data') False >>>
Метод path.isdir() возвращает True , если переданная в метод директория существует, и False – в противном случае:
>>> os.path.isdir(r'C:\Users\User\Python\Data\Samples') False
Для установления факта существования файла служит path.isfile():
>>> os.path.isfile(r'C:\Users\User\Python\matrix_challenge.py') False
Для преобразования пути в нижний регистр и нормализации слэшей используют path.normcase():
>>> os.path.normcase('C:/Users/User/Python') 'c:\\users\\user\\python'
Хотя путь к файлу (директории) представляет собой строку, создавать полный путь с помощью конкатенации считается моветоном – нужно использовать метод os . path . join ():
# Неправильно: my_cwd = os.getcwd() file_name = 'my_solution.py' path = my_cwd + '\\' + file_name # Правильно: path = os.path.join(my_cwd, file_name)
C:\Users\User\Python\my_solution.py
Операции с каталогами и файлами в Python
Для создания новых директорий служит os . mkdir (); в метод нужно передать полный путь, включающий название нового каталога:
import os my_cwd = os.getcwd() new_dir = 'Solutions' path = os.path.join(my_cwd, new_dir) os.mkdir(path) print(os.listdir())
['Data', 'lambda_functions.py', 'letters.py', 'os_methods.py', 'passw_generator.py', 'points.py', 'population.py', 'Solutions']
Изменить рабочую директорию можно с помощью метода os . chdir (), это аналог CLI команды cd :
>>> import os >>> os.getcwd() 'C:\\Users\\User\\Python' >>> os.chdir(r'C:\Users\User\Python\Data') >>> os.getcwd() 'C:\\Users\\User\\Python\\Data'
Использование os . chdir () может привести к ошибке, если путь к переданной в метод директории указан неправильно или не существует. Поэтому этот метод стоит использовать только с обработкой ошибок:
import sys, os my_cwd = os.getcwd() new_cwd = r'C:\Users\User\Python\MyData' try: os.chdir(new_cwd) print(f'Изменяем рабочую директорию на ') except: print(f'Произошла ошибка ') finally: print('Восстанавливаем рабочую директорию на прежнюю') os.chdir(my_cwd) print(f'Текущая рабочая директория - ')
Произошла ошибка (, FileNotFoundError(2, 'Не удается найти указанный файл'), ) Восстанавливаем рабочую директорию на прежнюю Текущая рабочая директория - C:\Users\User\Python
Создание директорий в Python
Для создания новых каталогов используют два метода:
- os.mkdir() – аналог CLI команды mkdir ; создает новую папку по указанному пути, при условии, что все указанные промежуточные (вложенные) директории уже существуют.
- os.makedirs() – аналог CLI команды mkdir -p dir1\dir2 ; помимо создания целевой папки, создает все промежуточные директории, если они не существуют.
Пример использования os.mkdir():
import os new_dir = 'NewProjects' parent_dir = r 'C:\Users\User\Python' path = os.path.join(parent_dir, new_dir) os.mkdir(path) print(f'Директория создана: ')
Директория NewProjects создана: ['Data', 'lambda_functions.py', 'letters.py', 'NewProjects', 'os_methods.py', 'Other', 'passw_generator.py', 'points.py', 'population.py', 'Solutions']
Пример использования makedirs():
import os new_dir = 'Django' parent_dir = r'C:\Users\User\Python\Other\Projects\Modules' path = os.path.join(parent_dir, new_dir) os.makedirs(path) print(f'Директория создана по адресу ')
Директория Django создана по адресу C:\Users\User\Python\Other\Projects\Modules
Копирование файлов и директорий в Python
Для копирования файлов используют метод shutil . copy 2(), который принимает два аргумента – источник файла и директорию, в которую нужно скопировать файл:
import os import shutil dest_path = r'C:\Users\User\Python\Data' source_path = r'C:\Users\User\lambda_exp.txt' print(f'Файлы в директории до копирования файла \ : \n') copy_file = shutil.copy2(source_path, dest_path) print(f'Файлы в директории после копирования файла \ : ')
Файлы в директории Data до копирования файла lambda_exp.txt: ['books_to_process.txt', 'challenge_data.txt', 'ledger.txt'] Файлы в директории Data после копирования файла lambda_exp.txt: ['books_to_process.txt', 'challenge_data.txt', 'lambda_exp.txt', 'ledger.txt']
Помимо метода shutil . copy 2(), для копирования файлов можно пользоваться методом shutil.copy(). Разница между этими двумя методами в том, что в отличие от shutil . copy 2(), метод shutil . copy () копирует только содержимое файла, но не метаданные:
import os import shutil dest_path = r'C:\Users\User\Python\Data' source_path = r'C:\Users\User\logfile.txt' print(f'Файлы в директории до копирования файла \ : \n') print(f'Метаданные: \n') copy_file = shutil.copy(source_path, dest_path) print(f'Файлы в директории после копирования файла \ : \n') print(f'Метаданные: \n')
Файлы в директории Data до копирования файла logfile.txt: ['books_to_process.txt', 'challenge_data.txt', 'lambda_exp.txt'] Метаданные: os.stat_result(st_mode=33206, st_ino=18014398509552989, st_dev=4236505663, st_nlink=1, st_uid=0, st_gid=0, st_size=455, st_atime=1629682315, st_mtime=1629681887, st_ctime=1629682315) Файлы в директории Data после копирования файла logfile.txt: ['books_to_process.txt', 'challenge_data.txt', 'lambda_exp.txt', 'logfile.txt'] Метаданные: os.stat_result(st_mode=16895, st_ino=11821949021901021, st_dev=4236505663, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1675257729, st_mtime=1675257729, st_ctime=1675084801)
Все содержимое каталога сразу можно скопировать с помощью shutil . copytree ():
import os import shutil dest_path = r'C:\Users\User\Python\Other\Files' source_path = r'C:\Users\User\Python\Other\Scripts' print(f'Содержимое директории до копирования каталога \ : \n') copy_dir = shutil.copytree(source_path, dest_path, dirs_exist_ok=True) print(f'Содержимое директории после копирования \ : \n')
Содержимое директории Files до копирования каталога Scripts: [] Содержимое директории Files после копирования Scripts: ['progression.py', 'sitemap_generator.py']
Перемещение файлов и директорий
Для перемещения файлов используют метод shutil . move ():
import os import shutil dest_path = r'C:\Users\User\Python\Other\Scripts' source_path = r'C:\Users\User\Desktop\sitemap_generator.py' print(f'Содержимое директории до копирования каталога \ : \n') copy_dir = shutil.move(source_path, dest_path) print(f'Содержимое директории после копирования \ : \n')
Содержимое директории Scripts до копирования каталога sitemap_generator.py: ['progression.py', 'wiki_scraping.py'] Содержимое директории Scripts после копирования sitemap_generator.py: ['progression.py', 'sitemap_generator.py', 'wiki_scraping.py']
Для перемещения содержимого всей директории в качестве функции указывают shutil . copytree ():
copy_dir = shutil.move(source_path, dest_path, copy_function = shutil.copytree)
Удаление файлов и директорий
Для удаления директории вместе со всеми файлами используют shutil.rmtree():
import os import shutil dir_path = r'C:\Users\User\Python\Other' remove_dir = 'Files' path = os.path.join(dir_path, remove_dir) print(f'Содержимое директории до удаления каталога \ : \n') shutil.rmtree(path) print(f'Содержимое директории после удаления \ : \n')
Содержимое директории Other до удаления каталога Files: ['Files', 'Projects'] Содержимое директории Other после удаления Files: ['Projects']
Другой метод для удаления пустых директорий – os.rmdir():
import os import shutil dir_path = r'C:\Users\User\Python\Other' remove_dir = 'Scripts' path = os.path.join(dir_path, remove_dir) print(f'Содержимое директории до удаления каталога \ : \n') os.rmdir(path) print(f'Содержимое директории после удаления \ : \n')
Содержимое директории Other до удаления каталога Scripts: ['Projects', 'Scripts'] Содержимое директории Other после удаления Scripts: ['Projects']
Очевидный минус метода os . rmdir () в том, что он работает только на пустых директориях – если поместить в каталог Scripts хотя бы один файл, удалить его с os . rmdir () уже не получится:
Traceback (most recent call last): File "C:\Users\User\Python\os_methods.py", line 8, in os.rmdir(path) OSError: [WinError 145] Папка не пуста: 'C:\\Users\\User\\Python\\Other\\Scripts'
Для удаления файлов используют метод os.remove():
import os import shutil dir_path = r'C:\Users\User\Python\Other\Scripts' remove_file = 'tetris_game.py' path = os.path.join(dir_path, remove_file) print(f'Содержимое директории до удаления файла \ : \n') os.remove(path) print(f'Содержимое директории после удаления \ : \n')
Содержимое директории Scripts до удаления файла tetris_game.py: ['tetris_game.py'] Содержимое директории Scripts после удаления tetris_game.py: []
Работа с файлами в Python
Открыть файл для проведения каких-либо манипуляций можно двумя способами:
- С помощью функции open() – в этом случае после завершения работы нужно будет закрыть файл с помощью close():
f = open('task.txt', 'a', encoding='utf-8') f.write('\n2) Написать модуль авторизации') f.close()
- С использованием менеджера контекста with, который автоматически и самостоятельно закроет файл, когда надобность в нем отпадет:
with open('task.txt', 'a', encoding='utf-8') as f: f.write('\n2) Написать модуль авторизации')
Типы файлов
В Python все файлы делятся на:
- Текстовые ‘t’
- Бинарные (двоичные) ‘b’
Если никакой определенный тип файла не указан, по умолчанию Python считает, что пользователь работает с текстовыми файлами. Поэтому для работы с изображениями, мультимедийными файлами и pdf, например, следует указывать, что тип файла относится к ‘b’ .
Режимы доступа и записи
| ‘r’ | Открывает файл для чтения. Возвращает ошибку, если указанный файл не существует. |
| ‘w’ | Открывает файл для записи, причем перезаписывает содержимое, если оно есть. Создает файл, если он не существует. |
| ‘a’ | Открывает файл для записи и добавляет новую информацию, не перезаписывая существующую. Создает файл, если он не существует. |
| ‘w+’ | Открывает файл для чтения и записи, перезаписывает содержимое. |
| ‘r+’ | Открывает файл для чтения и дополнения, не перезаписывает содержимое. |
| ‘x’ | Создает новый пустой файл. Возвращает ошибку, если файл с таким именем уже существует. |
Примечание: для операций с двоичными файлами к указанным параметрам нужно добавлять b , то есть вместо ‘ r ‘ должно быть ‘ rb ‘ , а вместо ‘ w +’ – ‘ wb +’ .
Методы работы с файлами
Для чтения данных используют read (). Метод read () по умолчанию возвращает все содержимое файла:
with open('books.txt', 'r', encoding='utf-8') as f: info = f.read() print(info)
1. "Террор", Дэн Симмонс 2. "Она же Грейс", Маргарет Этвуд 3. "Облачный атлас", Дэвид Митчелл 4. "Искупление", Иэн Макьюэн 5. "Госпожа Бовари", Гюстав Флобер
При необходимости объем выводимой информации можно ограничить определенным количеством символов:
with open('movies.txt', 'r', encoding='utf-8') as f: info = f.read(15) print(info)
1. "Из машины"
Метод readline () позволяет считывать информацию из текстовых файлов построчно:
with open('books.txt', 'r', encoding='utf-8') as f: info = f.readline() print(info)
1. "Террор", Дэн Симмонс
Для получения всех строк файла используют метод readlines(), который возвращает содержимое в виде списка – вместе со всеми спецсимволами:
with open('books.txt', 'r', encoding='utf-8') as f: info = f.readlines() print(info)
['1. "Террор", Дэн Симмонс\n', '2. "Она же Грейс", Маргарет Этвуд\n', '3. "Облачный атлас", Дэвид Митчелл\n', '4. "Искупление", Иэн Макьюэн\n', '5. "Госпожа Бовари", Гюстав Флобер']
Чтобы избавиться от лишних пробелов, символа новой строки (и любых других спецсимволов), используют методы rstrip (), lstrip () или strip ():
with open('books.txt', 'r', encoding='utf-8-sig') as f: info = [line.strip() for line in f.readlines()] print(info)
['1. "Террор", Дэн Симмонс', '2. "Она же Грейс", Маргарет Этвуд', '3. "Облачный атлас", Дэвид Митчелл', '4. "Искупление", Иэн Макьюэн', '5. "Госпожа Бовари", Гюстав Флобер']
Для записи информации в файл используют метод write ():
with open('books.txt', 'a', encoding='utf-8') as f: f.write('\n6. "Война и мир", Лев Толстой\n')
Или writelines():
with open('books.txt', 'a', encoding='utf-8') as f: f.writelines(['7. "Преступление и наказание", Федор Достоевский\n', '8. "Мизери", Стивен Кинг\n', '9. "Джейн Эйр", Шарлотта Бронте\n'])
Кроме того, записывать данные в файл можно с помощью print():
with open('crm_log.txt', 'a', encoding='utf-8') as file: print('\nСергей Леонов, 11:18, 12:23', file=file)
Чтобы узнать текущую позицию курсора в файле, используют метод tell():
with open('books.txt', 'r', encoding='utf-8-sig') as f: f.readline() f.read(5) print(f.tell())
Для считывания данных из определенной позиции используют seek():
with open('movies.txt', 'r', encoding='utf-8') as f: f.seek(53) print(f.read())
3. "Дракула Брэма Стокера"
Практика
Задание 1
Имеется файл books . txt , содержащий следующую информацию:
1. "Террор", Дэн Симмонс 2. "Она же Грейс", Маргарет Этвуд 3. "Облачный атлас", Дэвид Митчелл 4. "Искупление", Иэн Макьюэн 5. "Госпожа Бовари", Гюстав Флобер 6. "Война и мир", Лев Толстой 7. "Преступление и наказание", Федор Достоевский 8. "Мизери", Стивен Кинг 9. "Джейн Эйр", Шарлотта Бронте
Напишите программу, которая выводит первые 3 строки файла.
with open('books.txt', 'r', encoding='utf-8') as file: for i in range(3): line = file.readline().strip() print(line)
Задание 2
Напишите программу, которая получает от пользователя имя файла и возвращает следующие данные о его содержимом:
- количество строк;
- количество слов;
- число символов без пробелов и точек.
Пример ввода:
series.txt
Содержимое файла:
1. Последнее королевство 2015 2. Рим 2005 3. Версаль 2015 4. Тюдоры 2007 5. Террор 2018 6. Человек в высоком замке 2015 7. Белая королева 2013 8. Братья по оружию 2001 9. Медичи 2016 10. Спартак 2010
Количество строк в файле series.txt: 10 Количество слов: 17 Число символов: 153
filename = input() lines, words, symbols = 0, 0, 0 with open(filename, 'r', encoding='utf-8') as file: for i in file: lines += 1 words += len([w for w in i.split() if w.isalpha()]) symbols += len([s for s in i if s.isalnum()]) print(f'Количество строк в файле : \n' f'Количество слов: \n' f'Число символов: \n' )
Задание 3
Напишите программу, которая находит самое длинное слово в списке книг из первого задания.
Ожидаемый результат:
Преступление
with open('books.txt', 'r', encoding='utf-8') as file: words = file.read().replace('"', '').split() result = [w for w in words if len(w) == len(max(words, key=len))] print(*result)
Задание 4
Имеется файл fruit . txt со следующим содержимым:
Апельсин маракуйя папайя айва Яблоко апельсин яблоко ананас банан персик Слива Банан груша слива виноград авокадо Цитрон Слива Груша яблоко мандарин цитрон лимон Лайм апельсин ананас персик айва Хурма киви хурма манго авокадо лайм Нектарин Инжир гранат Папайя Гранат
Напишите программу, которая подсчитывает, сколько раз название каждого фрукта встречается в тексте.
Названия этих фруктов встречаются в тексте: "апельсин" - 3 раз(а) "маракуйя" - 1 раз(а) "папайя" - 2 раз(а) "айва" - 2 раз(а) "яблоко" - 3 раз(а) "ананас" - 2 раз(а) "банан" - 2 раз(а) "персик" - 2 раз(а) "слива" - 3 раз(а) "груша" - 2 раз(а) "виноград" - 1 раз(а) "авокадо" - 2 раз(а) "цитрон" - 2 раз(а) "мандарин" - 1 раз(а) "лимон" - 1 раз(а) "лайм" - 2 раз(а) "хурма" - 2 раз(а) "киви" - 1 раз(а) "манго" - 1 раз(а) "нектарин" - 1 раз(а) "инжир" - 1 раз(а) "гранат" - 2 раз(а)
with open('fruit.txt', 'r', encoding='utf-8') as file: result = <> for line in file: words = line.strip().lower().split() for w in words: result[w] = result.get(w, 0) + 1 print(f'Названия этих фруктов встречаются в тексте:') for k, v in result.items(): print(f'"" - раз(а)'
Задание 5
Имеются два файла, first . txt и second . txt . В первом файле перечислены имена, во втором – должности:
Содержимое файла first . txt
Сергей Ковалев Ирина Егорова Никита Степанов Марина Арефьева Кирилл Евстегнеев Елена Моисеева
Файл second . txt
мидл разработчик девопс тимлид сеньор разработчик продакт-менеджер дизайнер
Напишите программу, которая открывает оба файла и выводит сведения о сотрудниках в следующем формате:
Сотрудник Сергей Ковалев, должность - мидл разработчик Сотрудник Ирина Егорова, должность - девопс Сотрудник Никита Степанов, должность - тимлид Сотрудник Марина Арефьева, должность - сеньор разработчик Сотрудник Кирилл Евстегнеев, должность - продакт-менеджер Сотрудник Елена Моисеева, должность – дизайнер
with open('first.txt', 'r', encoding='utf-8') as file1, \ open('second.txt', 'r', encoding='utf-8') as file2: for line_x, line_y in zip(file1, file2): print(f'Сотрудник , должность - ')
Задание 6
Напишите программу, которая:
- генерирует коды букв русского алфавита от а до я;
- вставляет в полученный список код ё;
- записывает полный алфавит (строчный и прописной варианты каждой буквы) в столбик в файл alphabet.txt.
Содержимое файла после выполнения программы:
Аа Бб Вв Гг Дд Ее Ёё Жж Зз Ии Йй Кк Лл Мм Нн Оо Пп Рр Сс Тт Уу Фф Хх Цц Чч Шш Щщ Ъъ Ыы Ьь Ээ Юю Яя
alpha = [i for i in range(ord('а'), ord('я') + 1)] alpha.insert(6, 1105) with open('alphabet.txt', 'w', encoding='utf-8') as file: for i in alpha: file.write(chr(i).upper() + chr(i) + '\n')
Задание 7
Сведения о доходах и расходах компании хранятся в двух файлах, income . txt и outcome . txt . Напишите программу для подсчета прибыли компании.
Пример файла income.txt:
RUB100000 RUB200000 RUB200000 RUB500000 RUB600000 RUB100000 RUB700000
Пример файла outcome.txt:
-RUB1000 -RUB2000 -RUB50000 -RUB200000 -RUB10000 -RUB5000 -RUB6000 -RUB10000 -RUB19000 -RUB7000
Прибыль за прошлый месяц: 2090000 RUB
income, outcome = 0, 0 with open('income.txt', 'r', encoding='utf-8') as file1, \ open('outcome.txt', 'r', encoding='utf-8') as file2: for line in file1: num = line.strip()[3:] income += int(num) for line in file2: num = line.strip()[4:] outcome += int(num) print(f'Прибыль за прошлый месяц: RUB')
Задание 8
Напишите программу, которая считывает сведения об успеваемости по основным предметам из файла grades . txt , и определяет, кто из студентов имеет средний балл >= 4.5.
Пример файла grades . txt :
Арефьева И. 5 5 4 4 Богданов С. 5 5 3 4 Гаврилов Е. 4 4 3 3 Егорова А. 3 3 3 4 Семенова Е. 4 3 3 4 Хворостов И. 5 4 5 5
Ожидаемый результат:
Арефьева И., средний балл: 4.50 Хворостов И., средний балл: 4.75
result = <> with open('grades.txt', 'r', encoding='utf-8') as file1: for line in file1: l = line.strip().split() grades = [int(i) for i in l[-4:]] aver_grade = sum(grades) / len(grades) if aver_grade >= 4.5: result[l[0] + ' ' + l[1]] = aver_grade for student, aver_grade in result.items(): print(f', средний балл: ')
Задание 9
Напишите программу, которая получает от пользователя название файла с информацией на русском языке, и выполняет транслитерацию текста в соответствии с приведенным ниже словарем. Результат нужно записать в файл result . txt .
translit =
Пример русского текста:
Python — это язык программирования, который широко используется в интернет-приложениях, разработке программного обеспечения, науке о данных и машинном обучении (ML). Разработчики используют Python, потому что он эффективен, прост в изучении и работает на разных платформах.
Ожидаемое содержимое result.txt:
Python — jeto yazyk programmirovaniya, kotoryj shiroko ispol'zuetsya v internet-prilozheniyah, razrabotke programmnogo obespecheniya, nauke o dannyh i mashinnom obuchenii (ML). Razrabotchiki ispol'zujut Python, potomu chto on jeffektiven, prost v izuchenii i rabotaet na raznyh platformah.
translit = filename = input() with open(filename, 'r', encoding='utf-8') as source, open('result.txt', 'w', encoding='utf-8') as tr_result: for l in source.read(): trans = translit.get(l.lower(), l) tr_result.write(trans if l.islower() else trans.capitalize())
Задание 10
Имеется лог-файл crm _ log . txt с информацией о времени входа пользователей в CRM -систему и о времени выхода. Напишите программу, которая определяет пользователей, работавших в системе более 4 часов, и записывает их имена и фамилии в файл best _ employees . txt .
Пример лога crm _ log . txt :
Егор Тимофеев, 09:10, 16:50 Марина Абрамова, 12:00, 15:59 Никита Круглов, 09:10, 12:45 Анна Семенова, 08:10, 12:30 Юлия Сафонова, 10:10, 10:50 Михаил Колесников, 11:10, 12:10
Ожидаемый результат в файле best_employees.txt:
Егор Тимофеев Анна Семенова
with open('crm_log.txt', encoding='utf-8') as file_input, \ open('best_employees.txt', 'w', encoding='utf-8') as file_output: for line in file_input: start, end = [int(h) * 60 + int(m) for t in line.split(', ')[1:] for h, m in [t.split(':')]] if end - start > 240: file_output.write(line.split(', ')[0] + '\n')
Подведем итоги
Python предоставляет множество простых и удобных методов для работы с файловой системой и файлами. С помощью этих методов можно легко:
- Получать любую информацию о файлах и директориях.
- Создавать, изменять, перемещать и удалять директории и файлы.
- Проводить любые операции с содержимым текстовых и двоичных файлов.
В следующей статье будем изучать регулярные выражения.
- Особенности, сферы применения, установка, онлайн IDE
- Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
- Типы данных: преобразование и базовые операции
- Методы работы со строками
- Методы работы со списками и списковыми включениями
- Методы работы со словарями и генераторами словарей
- Методы работы с кортежами
- Методы работы со множествами
- Особенности цикла for
- Условный цикл while
- Функции с позиционными и именованными аргументами
- Анонимные функции
- Рекурсивные функции
- Функции высшего порядка, замыкания и декораторы
- Методы работы с файлами и файловой системой
- Регулярные выражения
- Основы скрапинга и парсинга
- Основы ООП: инкапсуляция и наследование
- Основы ООП – абстракция и полиморфизм
- Графический интерфейс на Tkinter
- Основы разработки игр на Pygame
- Основы работы с SQLite
- Основы веб-разработки на Flask
- Основы работы с NumPy
- Основы анализа данных с Pandas
Как записать файл в папку python
Zip представляет наиболее популярный формат архивации и сжатия файлов. И язык Python имеет встроенный модуль для работы с ними — zipfile . С помощью этого модуля можно создавать, считывать, записывать zip-файлы, получать их содержимое и добавлять в них файлы. Также поддерживается шифрование, но не поддерживается дешифрование.
Для представления zip-файла в этом модуле определен класс ZipFile . Он имеет следующий конструктор:
ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)
- file : путь к zip-файлу
- mode : режим открытия файла. Может принимать следующие значения:
- r : применяется для чтения существующего файла
- w : применяется для записи нового файла
- a : применяется для добавления в файл
- ZIP_STORED : архивация без сжатия (значение по умолчанию)
- ZIP_DEFLATED : стандартный тип сжатия при архивации в zip
- ZIP_BZIP2 : сжатие с помощью способа BZIP2
- ZIP_LZMA : сжатие с помощью способа LZMA
Для работы с файлами этот класс предоставляет ряд методов:
- close() : закрывает zip-файл
- getinfo() : возвращает информацию об одном файле из архива в виде объекта ZipInfo
- namelist() : возвращает список файлов архива
- infolist() : возвращает информацию обо всех файлах из архива в виде списока объектов ZipInfo
- open() : предоставляет доступ к одному из файлов в архиве
- read() : считывает файл из архива в набор байтов
- extract() : извлекает из архива один файл
- extractall() : извлекает все элементы из архива
- setpassword() : устанавливает пароль для zip-файла
- printdir() : выводит на консоль содержимое архива
Создание и закрытие файла
Для создания архивного файла в конструктор ZipFile передается режим «w» или «a»:
from zipfile import ZipFile myzip = ZipFile("metanit.zip", "w")После выполнения кода в текущей папке будет создаваться пустой архивный файл «metanit.zip».
После окончания работы с архивом для его закрытия применяется метод close() :
from zipfile import ZipFile myzip = ZipFile("metanit.zip", "w") myzip.close()Но так как ZipFile также представляет менеджер контекста, то он поддерживает выражение with , которое определяет контекст и автоматически закрывает файл по завершению контекста:
from zipfile import ZipFile with ZipFile("metanit.zip", "w") as myzip: passЗапись файлов в архив
Для записи файлов в архив применяется файл write() :
write(filename, arcname=None, compress_type=None, compresslevel=None)
Первый параметр представляет файл, который записиывается в архив. Второй параметр — arcname устанавливает произвольное имя для файла внутри архива (по умолчанию это само имя файла). Третий параметр — compress_type представляет тип сжатия, а параметр compresslevel — уровень сжатия.
Например, запишем в архив «metanit.zip» файл «hello.txt» (который, как предполагается, находится в той же папке, где и текущий скрипт python):
from zipfile import ZipFile with ZipFile("metanit.zip", "w") as myzip: myzip.write("hello.txt")Стоит учитывать, что при открытии файла в режиме «w» при всех последующих записях текущее содержимое будет затираться, то есть фактически архивный файл будет создаваться заново. Если нам необходимо добавить, то необходимо определять zip-файл в режиме «a»:
from zipfile import ZipFile with ZipFile("metanit.zip", "a") as myzip: myzip.write("hello2.txt") myzip.write("forest.jpg")Стоит отметить, что по умолчанию сжатие не применяется. Но при необходимости можно применить какой-нибудь способ сжатия и уровень сжатия»
from zipfile import ZipFile, ZIP_DEFLATED with ZipFile("metanit.zip", "w", compression=ZIP_DEFLATED, compresslevel=3) as myzip: myzip.write("hello.txt")Необходимо учитывать, что если мы попробуем добавить в архив файлы с уже имеющимися именами, то консоль выведет предупреждение. Чтобы избежать наличия файлов с дублирующимися именами можно через второй папаметр метода write явным образом определить для них уникальное имя внутри архива:
from zipfile import ZipFile with ZipFile("metanit.zip", "a") as myzip: myzip.write("hello.txt", "hello1.txt") myzip.write("hello.txt", "hello2.txt") myzip.write("hello.txt", "hello3.txt")Получение информации о файлах в архиве
Метод infolist() возвращает информацию о файлах в архиве с виде списка, где каждый отдельный файл представлен объектом ZipInfo:
from zipfile import ZipFile with ZipFile("metanit.zip", "a") as myzip: print(myzip.infolist())Класс ZipInfo предоставляет ряд атрибутов для хранения информации о файле. Основные из них:
- filename : название файла
- date_time : дата и время последнего изменения файла в виде кортежа в формате (год, месяц, день, час, минута, секунда)
- compress_type : тип сжатия
- compress_size : размер после сжатия
- file_size : оригинальный размер файла до сжатия
Получим эти данные по каждому отдельному файлу в архиве:
from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: for item in myzip.infolist(): print(f"File Name: Date: Size: ")Примерный консольный вывод:
File Name: hello.txt Date: (2022, 11, 23, 20, 21, 34) Size: 18 File Name: forest.jpg Date: (2022, 11, 19, 20, 46, 52) Size: 103956 File Name: hello1.txt Date: (2022, 11, 23, 20, 21, 34) Size: 18 File Name: hello2.txt Date: (2022, 11, 23, 20, 21, 34) Size: 18 File Name: hello3.txt Date: (2022, 11, 23, 20, 21, 34) Size: 18
С помощью метода is_dir() можно проверить, является ли элемент в архиве папкой:
from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: for item in myzip.infolist(): if(item.is_dir()): print(f"Папка: ") else: print(f"Файл: ")Если надо получить только список имен входящих в архив файлов, то применяется метод namelist() :
from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: for item in myzip.namelist(): print(item)Консольный вывод в моем случае:
hello.txt forest.jpg hello1.txt hello2.txt hello3.txt
С помощью метода getinfo() можно получить данные по одному из архивированных файлов, передав в метод его имя в архиве. Результат метода — объект ZipInfo:
from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: try: hello_file = myzip.getinfo("hello.txt") print(hello_file.file_size) except KeyError: print("Указанный файл отсутствует")Если в архиве не окажется элемента с указанным именем, то метод сгенерирует ошибку KeyError.
Извлечение файлов из архива
Для извлечения всех файлов из архива применяется метод extractall() :
extractall(path=None, members=None, pwd=None)
Первый параметр метода устанавливает каталог для извлечения архива (по умолчанию извлечение идет в текущий каталог). Параметр members представляет список строк — список названий файлов, которые надо извлечт из архива. И третий параметр — pwd представляет пароль, в случае если архив закрыт паролем.
Например, извлечем все файлы из архива:
from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: myzip.extractall()Извлечение в определенную папку:
myzip.extractall(path="metanit")
Извлечение части файлов:
# извлекаем файлы "hello.txt", "forest.jpg" в папку "metanit2" myzip.extractall(path="metanit2", members=["hello.txt", "forest.jpg"])
Для извлечения одного файла применяется метод extract() , в который в качестве обязательного параметра передается имя извлекаемого файла:
myzip.extract("hello.txt")Считывание файла
Метод read() позволяет считать содержимое файла из архива в набор байтов:
from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: content = myzip.read("hello5.txt") print(content)Открытие файла
Метод open() позволяет открывать отдельные файлы из архива без непосредственного их извлечения:
open(name, mode='r', pwd=None, *, force_zip64=False)
В качестве первого обязательного параметра передается имя файла внутри архива. Второй параметр — mode устанавливает режим открытия. Параметр pwd задает пароль, если файл защищен паролем. И параметр force_zip64 при значении True позволяет открывать файлы больше 4 Гб.
Этот файл может быть полезен для манипулирования файлом, например, для считывания его содержимого или, наоборот, для записи в него. Например, откроем файл и считаем его содержимое:
from zipfile import ZipFile with ZipFile("metanit.zip", "a") as myzip: # записываем в архив новый файл "hello5.txt" with myzip.open("hello5.txt", "w") as hello_file: encoded_str = bytes("Python. ", "UTF-8") hello_file.write(encoded_str)
