Работа с файловой системой python: Часть 9. Процессы и потоки

Содержание

Часть 9. Процессы и потоки

Программирование на Python

Сергей Яковлев
Опубликовано 02.09.2010

Серия контента:

Этот контент является частью # из серии # статей: Программирование на Python

https://www.ibm.com/developerworks/ru/library/?series_title_by=**auto**

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Программирование на Python

Следите за выходом новых статей этой серии.

С появлением многоядерных процессоров стала общеупотребительной практика распространять нагрузку на все доступные ядра. Существует два основных подхода в распределении нагрузки: использование процессов и потоков.

Использование нескольких процессов фактически означает использование нескольких программ, которые выполняются независимо друг от друга. Программно это решается с помощью системных вызовов exec и fork. Такой подход создает большие неудобства в управлении обмена данными между этими программами.

В качестве альтернативы существует другой подход – создание многопоточных программ. Обмен данными между потоками существенно упрощается. Но управление такими программами усложняется, и вся ответственность ложится на программиста.

Сегодня мы рассмотрим следующие темы.

  • Как работают процессы.
  • Как работают потоки в питоне.
  • Создание потока.
  • Очереди (Queue).
  • Блокировки (Lock).

1. Как работают процессы

В питоне есть стандартный модуль subprocess, который упрощает управление другими программами, передавая им опции командной строки и организуя обмен данными через каналы (pipe). Мы рассмотрим пример, в котором пользователь запускает программу из командной строки, которая в свою очередь запустит несколько дочерних программ. В данном примере два скрипта – рarent.py и child.py. Запускается parent.py. Child.py выступает в роли аргумента command, который передается в запускаемый процесс. У этого процесса есть стандартный вход, куда мы передаем два аргумента – поисковое слово и имя файла. Мы запустим два экземпляра программы child.py, каждый экземпляр будет искать слово word в своем файле – это будут файлы исходников самих программ. Запись на стандартный вход осуществляет модуль subprocess. Каждый процесс пишет результат своего поиска в консоль. В главном процессе мы ждем, пока все child не закончат свою работу.

Код parent.py:

import os
import subprocess
import sys


child = os.path.join(os.path.dirname(__file__), "./child.py")
word  = 'word'
file = ['./parent.py','./child.py']

pipes = []
for i in range(0,2):
  command = [sys.executable, child]
  pipe = subprocess.Popen(command, stdin=subprocess.PIPE)
  pipes.append(pipe)
  pipe.stdin.write(word.encode("utf8") + b"\n")
  pipe.stdin.write(file[i].encode("utf8") + b"\n")
  pipe.stdin.close()

while pipes:
    pipe = pipes.pop()
    pipe.wait()

Код child.py:

import sys

word = sys.stdin.readline().rstrip()
filename = sys.stdin.readline().rstrip()

try:
  with open(filename, "rb") as fh:
    while True:
      current = fh.readline()
      if not current:
          break
      if (word in current ):
          print("find: {0} {1}".format(filename,word))
except :
    pass

2. Как работают потоки в питоне

Если нужно, чтобы ваше приложение выполняло несколько задач в одно и то же время, то можете воспользоваться потоками (threads). Потоки позволяют приложениям выполнять в одно и то же время множество задач. Многопоточность (multi-threading) важна во множестве приложений, от примитивных серверов до современных сложных и ресурсоёмких игр.

Когда в одной программе работают несколько потоков, возникает проблема разграничения доступа потоков к общим данным. Предположим, что есть два потока, имеющих доступ к общему списку. Первый поток может делать итерацию по этому списку:

  for x in L

а второй в этот момент начнет удалять значения из этого списка. Тут может произойти все что угодно: программа может упасть, или мы просто получим неверные данные.

Решением в этом случае является применение блокировки. При этом доступ к заблокированному списку будет иметь только один поток, второй будет ждать, пока блокировка не будет снята.

Применение блокировки порождает другую проблему – дедлок (deadlock) – мертвая блокировка. Пример дедлока: имеется два потока и два списка. Первый поток блокирует первый список, второй поток блокирует второй список. Первый поток изнутри первой блокировки пытается получить доступ к уже заблокированному второму списку, второй поток пытается проделать то же самое с первым списком. Получается неопределенная ситуация с бесконечным ожиданием. Эту ситуации легко описать, на практике все гораздо сложнее.

Вариантом решения проблемы дедлоков является политика определения очередности блокировок. Например, в предыдущем примере мы должны определить, что блокировка первого списка идет всегда первой, а уже потом идет блокировка второго списка.

Другая проблема с блокировками – в том, что несколько потоков могут одновременно ждать доступа к уже заблокированному ресурсу и при этом ничего не делать. Каждая питоновская программа всегда имеет главный управляющий поток.

Питоновская реализация многопоточности ограниченная. Интерпретатор питона использует внутренний глобальный блокировщик (GIL), который позволяет выполняться только одному потоку. Это сводит на нет преимущества многоядерной архитектуры процессоров. Для многопоточных приложений, которые работают в основном на дисковые операции чтения/записи, это не имеет особого значения, а для приложений, которые делят процессорное время между потоками, это является серьезным ограничением.

3. Создание потока

Для создания потоков мы будем использовать стандартный модуль threading. Есть два варианта создания потоков:

вызов функции

  threading.Thread()

вызов класса

  threading.Thread

Следующий пример показывает, как к потоку приаттачить функцию через вызов функции:

import threading
import time
def clock(interval):
    while True:
        print("The time is %s" % time.ctime())
        time.sleep(interval)
t = threading.Thread(target=clock, args=(15,))
t.daemon = True
t.start()

Пример на создание потока через вызов класса: в конструкторе обязательно нужно вызвать конструктор базового класса. Для запуска потока нужно выполнить метод start() объекта-потока, что приведет к выполнению действий в методе run():

import threading
import time
class ClockThread(threading.Thread):
    def __init__(self,interval):
        threading.Thread.__init__(self)
        self.daemon = True
        self.interval = interval
    def run(self):
        while True:
            print("The time is %s" % time.ctime())
            time.sleep(self.interval)
t = ClockThread(15)
t.start()

Для управления потоками существуют методы:

start()

– дает потоку жизнь.

run() –этот метод представляет действия, которые должны быть выполнены в потоке.

join([timeout]) – поток, который вызывает этот метод, приостанавливается, ожидая завершения потока, чей метод вызван. Параметр timeout (число с плавающей точкой) позволяет указать время ожидания (в секундах), по истечении которого приостановленный поток продолжает свою работу независимо от завершения потока, чей метод join был вызван. Вызывать join() некоторого потока можно много раз. Поток не может вызвать метод join() самого себя. Также нельзя ожидать завершения еще не запущенного потока.

getName() – возвращает имя потока.

setName(name) – присваивает потоку имя name.

isAlive() – возвращает истину, если поток работает (метод run() уже вызван).

isDaemon() – возвращает истину, если поток имеет признак демона.

setDaemon(daemonic) – устанавливает признак daemonic того, что поток является демоном.

activeCount() – возвращает количество активных в настоящий момент экземпляров класса Thread. Фактически это len(threading.enumerate()).

currentThread() – возвращает текущий объект-поток, т.е. соответствующий потоку управления, который вызвал эту функцию.

enumerate() – возвращает список активных потоков.

4. Очереди (Queue)

В следующем примере будет решена аналогичная задача, что и в предыдущем примере с процессами: будут запущены три потока, каждый из которых будет работать по принципу утилиты grep. Имеется глобальный ресурс – work_queue – список файлов для поиска, который мы положим в очередь. Для этого будет использован объект Queue, который имеет встроенную блокировку:

import threading
import Queue

class Worker(threading.Thread):

    def __init__(self, work_queue, word):
        super(Worker,self).__init__()
        self.work_queue = work_queue
        self.word = word

    def run(self):
        try:
            filename = self.work_queue.get()
            self.process(filename)
        finally:
            pass

    def process(self, filename):
        previous = "
        current=True
        with open(filename, "rb") as fh:
            while current:
                current = fh.readline()
                if not current: break
                current = current.decode("utf8", "ignore")
                if self.word in current :
                    print("find {0}: {1}".format(self.word,filename))
                previous = current

word = 'import'
filelist = ['./file1.py','./file2.py','./file3.py']
work_queue = Queue.Queue()
for filename in filelist:
    work_queue.put(filename)
for i in range(3):
    worker = Worker(work_queue, word)
    worker.start()

5. Блокировки (Lock)

В следующем примере будут созданы три потока, каждый из которых будет считывать стартовую страницу по указанному Web-адресу. В примере имеется глобальный ресурс – список урлов –

url_list – доступ к которому будет блокироваться с помощью блокировки threading.Lock(). Объект Lock имеет методы:

acquire([blocking=True]) – делает запрос на запирание замка. Если параметр blocking не указан или является истиной, то поток будет ожидать освобождения замка.

Если параметр не был задан, метод не возвратит значения.

Если blocking был задан и истинен, метод возвратит True (после успешного овладения замком).

Если блокировка не требуется (т.е. задан blocking=False), метод вернет True, если замок не был заперт и им успешно овладел данный поток. В противном случае будет возвращено False.

release() – запрос на отпирание замка.

locked()

– возвращает текущее состояние замка (True – заперт, False – открыт).

import threading
from urllib import urlopen

class WorkerThread(threading.Thread):
  def __init__(self,url_list,url_list_lock):
    super(WorkerThread,self).__init__()
    self.url_list=url_list
    self.url_list_lock=url_list_lock
    
  def run(self):
    while (1):
      nexturl = self.grab_next_url()
      if nexturl==None:break
      self.retrieve_url(nexturl)
        
  def grab_next_url(self):
    self.url_list_lock.acquire(1)
    if len(self.url_list)<1:
      nexturl=None
    else:
      nexturl = self.url_list[0]
      del self.url_list[0]
    self.url_list_lock.release()
    return nexturl  
        
        
  def retrieve_url(self,nexturl):
    text = urlopen(nexturl).read()
    print text
    print '################### %s #######################' % nexturl
    
url_list=['http://linux.org.ru','http://kernel.org','http://python.org']
url_list_lock = threading.Lock()
workerthreadlist=[]
for x in range(0,3):
  newthread = WorkerThread(url_list,url_list_lock)
  workerthreadlist.append(newthread)
  newthread.start()
for x in range(0,3):
  workerthreadlist[x].join()

Заключение

Параллельное программирование становится в последнее время жизненной необходимостью, которая диктуется темпами развития многоядерных процессоров. Одним из вариантов организации параллельного программирования является многопоточное программирование. В обычной программе действует всего один поток управления, а в многопоточной одновременно могут работать несколько потоков.

В многопоточной программе усложняется контроль за обменом данных между потоками. Глобальные ресурсы необходимо предохранять от одновременного доступа со стороны нескольких потоков, чтобы не нарушить их целостности. В этой статье были рассмотрены инструменты контроля глобальных данных – блокировки, очереди.

Приведенные примеры проверялись на версии питона 2.6.

< Предыдущая статья. Следующая статья >

Ресурсы для скачивания

создание, изменение, удалений файлов ~ PythonRu

Обработка файлов в Python с помощью модуля os включает создание, переименование, перемещение, удаление файлов и папок, а также получение списка всех файлов и каталогов и многое другое.

В индустрии программного обеспечения большинство программ тем или иным образом обрабатывают файлы: создают их, переименовывают, перемещают и так далее. Любой программист должен обладать таким навыком. С этим руководством вы научитесь использовать модуль os в Python для проведения операций над файлами и каталогами вне зависимости от используемой операционной системы.

Важно знать, что модуль os используется не только для работы с файлами. Он включает массу методов и инструментов для других операций: обработки переменных среды, управления системными процессами, а также аргументы командной строки и даже расширенные атрибуты файлов, которые есть только в Linux.

Модуль встроенный, поэтому для работы с ним не нужно ничего устанавливать.

Вывод текущей директории

Для получения текущего рабочего каталога используется os.getcwd():

import os


print("Текущая деректория:", os.getcwd())

os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог. Вот пример вывода:

Текущая деректория: C:\python3\bin

Создание папки

Для создания папки/каталога в любой операционной системе нужна следующая команда:


os.mkdir("folder")

После ее выполнения в текущем рабочем каталоге тут же появится новая папка с названием «folder».

Если запустить ее еще раз, будет вызвана ошибка FileExistsError, потому что такая папка уже есть. Для решения проблемы нужно запускать команду только в том случае, если каталога с таким же именем нет. Этого можно добиться следующим образом:



if not os.path.isdir("folder"):
     os.mkdir("folder")

Функция os.path.isdir() вернет True, если переданное имя ссылается на существующий каталог.

Изменение директории

Менять директории довольно просто. Проделаем это с только что созданным:


os.chdir("folder")

Еще раз выведем рабочий каталог:


print("Текущая директория изменилась на folder:", os.getcwd())

Вывод:

Текущая директория изменилась на folder: C:\python3\bin\folder

Создание вложенных папок

Предположим, вы хотите создать не только одну папку, но и несколько вложенных:


os.chdir("..")


os.makedirs("nested1/nested2/nested3")

Это создаст три папки рекурсивно, как показано на следующем изображении:

Создание файлов

Для создания файлов в Python модули не нужны. Можно использовать встроенную функцию open(). Она принимает название файла, который необходимо создать в качестве первого параметра и желаемый режим открытия — как второй:


text_file = open("text.txt", "w")

text_file.write("Это текстовый файл")

w значит write (запись), a — это appending (добавление данных к уже существующему файлу), а r — reading (чтение). Больше о режимах открытия можно почитать здесь.

Переименование файлов

С помощью модуля os достаточно просто переименовать файл. Поменяем название созданного в прошлом шаге.


os.rename("text.txt", "renamed-text.txt")

Функция os.rename() принимает 2 аргумента: имя файла или папки, которые нужно переименовать и новое имя.

Перемещение файлов

Функцию os.replace() можно использовать для перемещения файлов или каталогов:


os.replace("renamed-text.txt", "folder/renamed-text.txt")

Стоит обратить внимание, что это перезапишет путь, поэтому если в папке folder уже есть файл с таким же именем (renamed-text.txt), он будет перезаписан.

Список файлов и директорий


print("Все папки и файлы:", os.listdir())

Функция os.listdir() возвращает список, который содержит имена файлов в папке. Если в качестве аргумента не указывать ничего, вернется список файлов и папок текущего рабочего каталога:

Все папки и файлы: ['folder', 'handling-files', 'nested1', 'text.txt']

А что если нужно узнать состав и этих папок тоже? Для этого нужно использовать функцию os.walk():


for dirpath, dirnames, filenames in os.walk("."):
    
    for dirname in dirnames:
        print("Каталог:", os.path.join(dirpath, dirname))
    
    for filename in filenames:
        print("Файл:", os.path.join(dirpath, filename))

os.walk() — это генератор дерева каталогов. Он будет перебирать все переданные составляющие. Здесь в качестве аргумента передано значение «.», которое обозначает верхушку дерева:

Каталог: .\folder
Каталог: .\handling-files
Каталог: .\nested1
Файл: .\text.txt
Файл: .\handling-files\listing_files.py
Файл: .\handling-files\README.md
Каталог: .\nested1\nested2
Каталог: .\nested1\nested2\nested3

Метод os.path.join() был использован для объединения текущего пути с именем файла/папки.

Удаление файлов

Удалим созданный файл:


os.remove("folder/renamed-text.txt")

os.remove() удалит файл с указанным именем (не каталог).

Удаление директорий

С помощью функции os.rmdir() можно удалить указанную папку:


os.rmdir("folder")

Для удаления каталогов рекурсивно необходимо использовать os.removedirs():


os.removedirs("nested1/nested2/nested3")

Это удалит только пустые каталоги.

Получение информации о файлах

Для получения информации о файле в ОС используется функция os.stat(), которая выполняет системный вызов stat() по выбранному пути:

open("text.txt", "w").write("Это текстовый файл")


print(os.stat("text.txt"))

Вывод:

os.stat_result(st_mode=33206, st_ino=14355223812608232, st_dev=1558443184, st_nlink=1, st_uid=0, st_gid=0, st_size=19, st_atime=1575967618, st_mtime=1575967618, st_ctime=1575966941)

Это вернет кортеж с отдельными метриками. В их числе есть следующие:

    • st_size — размер файла в байтах
    • st_atime — время последнего доступа в секундах (временная метка)
    • st_mtime — время последнего изменения
    • st_ctime — в Windows это время создания файла, а в Linux — последнего изменения метаданных

Для получения конкретного атрибута нужно писать следующим образом:


print("Размер файла:", os.stat("text.txt").st_size)

Вывод:

Размер файла: 19

На этой странице больше об атрибутах.

Выводы

Работать с файлами и каталогами в Python очень просто. Не имеет значения даже используемая операционная система, хотя отдельные уникальные для системы функции можно использовать: например, os.chown() или os.chmod() в Linux. Более подробно эта тема освещена в официальной документации Python.

Как в Python создать файл, записать и прочитать текст ~ PythonRu

Умение создавать файлы в Python открывает массу новых возможностей — например, позволяет хранить данные, сохраняя их согласованность для разных пользователей. Вместе с тем упрощает процесс управления данными, скрапинга контента и многое другое.

Важно и то, что в Python этот процесс очень простой.

Как создать файл в Python в три строки

С помощью следующего кода можно создать файл с названием BabyFile.txt и записать в него текст «Привет, файл!»:


my_file = open("BabyFile.txt", "w+")
my_file.write("Привет, файл!")
my_file.close()

В начале объявляется переменная my_file. После этого используются встроенные функции open и write для открытия и записи в файл. "w+" сообщает, что запись будет осуществляться в новый файл. Если он существует, то новое содержимое нужно записать поверх уже существующего. Если же вместо этого использовать параметр "w", тогда файл будет создан только в том случае, если он не существовал до этого.

Важно заметить, что в конце файл всегда нужно закрывать, чтобы изменения сохранились.

Как записывать, добавляя новое содержимое

С созданием файла разобрались. Теперь можно узнать, как редактировать, удалять и даже копировать файлы.

Если нужно добавить новые данные в файл, тогда вместо "w+" нужно просто использовать параметр "a+".


my_file = open("BabyFile.txt", "a+")
my_file.write("и еще кое-что!")
my_file.close()

Однако в таком случае не будет добавлена новая строка, поэтому важно не забыть использовать символ \n.

Для чтения же файла нужно выполнить такую команду:


my_file = open("BabyFile.txt", "a+")
file_contents == my_file.read()
print(file_contents)
Привет, файл!и еще кое-что!

Удаление и перемещение файлов

Зная, как создавать файл, важно уметь определять, существует ли он в системе. Это важно, ведь в противном случае можно попробовать записать, отредактировать или удалить файл, которого не существует, что приведет к ошибке.

Для этого используется модуль os, который также по умолчанию доступен в Python. Достаточно лишь импортировать его и можно приступать к использованию — для этого используются path и методы isfile(), isdir() или exists().


os.path.isfile("/путь/к/файлу")

С помощью этого модуля можно даже переименовывать файлы. Это просто:


os.rename("/путь/к/файлу", "/новый_путь/к/переименованному_файлу")

Особенно круто то, что если отредактировать путь, то файл переместится в соответствующую локацию. Как вариант, можно также использовать модуль shutil:


shutil.move("/путь/к/файлу", "/новый_путь/к/переименованному_файлу")

Наконец, для удаления файлов используется os.remove().

Вот и все. Теперь вы знаете, как создавать файлы, изменять их или удалять.

Краткий итог

Как в Python создать файл

  1. Создать файл

    my_file = open("file.txt", "w+")

  2. Записать в файл

    my_file.write("Привет, файл!")

  3. Сохранить и закрыть файл

    my_file.close()

Python: работа с файлами — все файловые операции open, read, write, append, split, close, rename и remove

File handling — это в основном управление файлами в файловой системе. В каждой операционной системе есть свой способ хранения файлов.

Работа с файлами в Python полезна для работы, так как нам не нужно беспокоиться о базовой операционной системе, ее правилах и операциях файловой системы.

1. функция open()

Функция open() используется для открытия файла в определенном режиме.

По сути, он создает файловый объект, который можно использовать для дальнейших манипуляций.

Синтаксис:
open(file_name, mode)
Различные режимы открытия файла:

  • r: Читать
  • w: написать
  • a: Добавить
  • r +: чтение и запись

Изначально нам нужно создать файл и поместить его в тот же каталог, что и сценарий.

Demo.txt
Welcome to the programming world!
Execute_file.py

demo_file = open('Demo.txt', 'r')
# This statement will print every line in the file
for x in demo_file:
    print (x)

# close the file, very important
demo_file.close()

Выход:
Welcome to the programming world!
Здесь сценарий Execute_file.py открывает файл Demo.txt и выводит на печать все содержимое построчно.

2. функция read()

Функция read() используется для чтения содержимого файла. Чтобы добиться того же, нам нужно открыть файл в режиме чтения.

demo_file = open("Demo.txt", "r")
print(demo_file.read())
demo_file.close()

Выход:
Welcome to the programming world!

3. функция write()

Функция write() используется для записи в файл и внесения в него изменений.

demo_file = open('Demo.txt','w')
demo_file.write("Hello Everyone!.\n")
demo_file.write("Engineering Discipline.")
demo_file.close()

Вывод: когда мы открываем файл Demo.txt, мы видим отраженные здесь изменения.
Hello Everyone!.
Engineering Discipline.

4. append()

demo_file = open('Demo.txt','a')

demo_file.write("\nStatement added to the end of the file..")
demo_file.close()

Выход:
Hello Everyone!.
Engineering Discipline.
Statement added to the end of the file..

5. split()

Функция split() используется для разделения строк в файле. Он разделяется, как только встречается в сценарии.

Demo.txt

Hello Everyone!.
Engineering Discipline.
Statement added to the end of the file..

Execute_file.py

with open("Demo.txt", "r") as demo_file:
    demo_data = demo_file.readlines()
    for line in demo_data:
        result = line.split()
        print(result)

Выход:

['Hello', 'Everyone!.']
['Engineering', 'Discipline.']
['Statement', 'added', 'to', 'the', 'end', 'of', 'the', 'file..']

6. close()

Функция close() используется для закрытия манипуляций с определенным файлом в нем.

После записи в файл, если мы не вызовем метод close(), все данные, записанные в файл, не будут сохранены в нем.

Всегда рекомендуется закрыть файл после того, как мы закончили с ним, чтобы освободить ресурсы.

Синтаксис:
file-name.close()

7. Функция rename()

Модуль os предоставляет метод rename() для изменения имени конкретного файла.

Синтаксис:
os.rename(current_name,new_name)

8. метод remove()

Модуль os предоставляет метод remove() для удаления файла, указанного в качестве входных данных.

import os
os.remove('Demo.txt')

Перед выполнением метода remove()

Вывод: после выполнения метода remove()

Работа с каталогами в Python

Directory — это в основном структура, которая содержит все соответствующие документы, файлы и папки.

Модуль os содержит несколько функций для управления каталогами в Python.

Функции каталогов Python

os.access (path, mode) Он использует uid для проверки доступа к пути.
os.chdir (путь) Он изменяет CWD на путь, указанный пользователем.
os.chflags (путь, флаги) Используется для установки флагов в числовые флаги.
os.chmod (path, mode) Используется для изменения режима пути на числовой режим.
os.chown (path, uid, gid) Изменяет идентификатор группы и владельца пути на числовые uid и gid.
os.chroot (путь) Он используется для изменения корневого каталога текущего выполняемого процесса на путь, указанный пользователем.
os.fchdir (fd) Используется для изменения CWD на каталог, представленный в файловом дескрипторе fd.
os.getcwd() Возвращает текущий рабочий каталог (CWD).
os.getcwdu() Он возвращает объект Unicode в качестве вывода, представленный CWD.
os.lchmod (path, mode) Используется для изменения режима пути на числовой.
os.listdir (путь) Возвращает список, содержащий имена записей в каталоге, заданном путем.
os.lstat (путь)
os.makedirs (path [, mode]) Используется для рекурсивного создания каталогов.
os.mkdir() Он используется для создания нового каталога с указанным путем.
os.mkfifo (путь [, режим])
os.readlink (путь)
os.removedirs (путь) Используется для рекурсивного удаления соответствующих каталогов.
os.rename (src, dst) Используется для переименования каталога src в dst.
os.renames (old, new) Используется для рекурсивного переименования старых каталогов в новый.
os.rmdir (путь) Используется для удаления каталога, указанного пользователем.
os.stat (путь)

1. Создание нового каталога

Модуль Python os предоставляет функцию mkdir() для создания нового каталога.

Синтаксис:
os.mkdir('name')

import os
os.mkdir('C:/python1') #create a direcotry abc in C:

Выход:

2. Получить текущий рабочий каталог

Функция getcwd() используется для получения местоположения CWD.

import os
os.getcwd() 

Выход:
wdir='C:/Users/HP/PycharmProjects/Hello'

3. Переименовать

Функция rename() используется для переименования CWD.

Синтаксис:
os.rename(old,new)

4. Получить список файлов и каталогов

Функция listdir() используется для получения списка всех каталогов и файлов, имеющихся в текущем каталоге.

import os
os.listdir('C:\\Users\\HP')

Выход:
['.android', '.AndroidStudio3.5', '.crashlytics', '.eclipse', '.emulator_console_auth_token', '.gradle', '.idlerc', '.m2', '.nbi', '.netbeans-derby', '.p2', '.PyCharm2019.3', '.RapidMiner', '.tooling', '.vscode', '3D Objects', 'Anaconda3', 'Anaconda3_1', 'AndroidStudioProjects', 'AppData', 'Application Data', 'Contacts', 'Cookies', 'Desktop', 'Documents', 'Downloads', 'eclipse', 'eclipse-workspace', 'Favorites', 'get-pip.py', 'HP', 'IntelGraphicsProfiles', 'Links', 'Local Settings', 'MicrosoftEdgeBackups']

5. Как удалить каталог

Функция rmdir() используется для удаления каталога, который уже пуст. Если каталог не пустой, он не будет удален.

import os
os.rmdir('C:\\Users\\HP\\Pictures\\Screenshots\\python')

6. Проверить наличие

Функция os.path.exists(path) используется для проверки, существует ли конкретный каталог или нет.

import os
os.path.exists('C:\\Users\\HP\\Pictures\\Screenshots')

Выход:
True

Как копировать файл в Python используя модули shutil, os, subprocess

В наших предыдущих руководствах мы изучили некоторые операции с файлами Python, такие как чтение, запись и удаление.

Мы можем скопировать файл в Python, используя различные методы в нижеперечисленных модулях,

  • модуль shutil
  • модуль os
  • модуль subprocess

В этом руководстве мы научимся использовать различные методы, предоставляемые вышеуказанными модулями, для копирования файла в Python.

1 shutil модуль

Модуль shutil предоставляет несколько простых в использовании методов, с помощью которых мы можем удалить или скопировать файл. Давайте посмотрим на различные методы, определенные в этом модуле, специально используемые для копирования.

1 copyfileobj()

Метод copyfileobj() копирует содержимое исходного файла в целевой файл, используя соответствующие файловые объекты. Давайте посмотрим на код ниже,

import shutil
src_file_obj=open('src.txt', 'rb')
targ_file_obj= open('targ.txt' , 'wb')
shutil.copyfileobj( src_file_obj , targ_file_obj )

Примечание: объекты файлов должны указывать на позиции 0 (начальную позицию) для соответствующих исходных и целевых файлов, чтобы скопировать все содержимое.

2 copyfile()

Метод copyfile() копирует содержимое из исходного файла в целевой файл, используя пути к файлам. Он возвращает путь к целевому файлу. Путь к целевому файлу должен быть доступен для записи, иначе возникнет исключение OSerror.

import shutil
shutil.copyfile( 'src.txt' , 'targ.txt' )

Следует иметь в виду, что метод позволяет использовать только пути к файлам, а не каталоги.

3 copy()

Этот метод копирует исходный файл в целевой файл или целевой каталог. В отличие от copyfile() , метод copy() позволяет использовать целевой каталог в качестве аргумента, а также копирует права доступа к файлу. copy() возвращает путь к целевому файлу после копирования содержимого.

import shutil
shutil.copy('/Users/test/file.txt', '/Users/target/')

В целевом месте назначения создается файл с именем file.txt со всем содержимым и разрешениями, скопированными из /Users/test/file.txt.

4 copy2()

Метод copy2() используется точно так же, как метод copy() . Они также работают аналогичным образом, за исключением того факта, что copy2() также копирует метаданные из исходного файла.

import shutil
shutil.copy2('/Users/test/file.txt', '/Users/target/')

2 Модуль os

1 popen()

Метод popen() создает канал к команде cmd. Метод возвращает файловый объект, подключенный к каналу cmd. Взгляните на код ниже,

#for Windows
import os
os.popen('copy src.txt targ.txt' )
#for Linux
import os
os.popen('cp src.txt targ.txt' )

С помощью этого метода мы можем выполнять другие обычные команды.

2 system()

Метод system() напрямую вызывает и выполняет аргумент команды в подоболочке. Его возвращаемое значение зависит от ОС, в которой запущена программа. Для Linux это статус выхода, тогда как для Windows это значение, возвращаемое системной оболочкой.

#for Linux
import os
os.system(' cp src.txt targ.txt' )
#for Windows
import os
os.system(' copy src.txt targ.txt' )

3 Модуль подпроцесса

1. call()

Метод call() аналогичный os.system() напрямую вызывает или запускает команду, переданную в качестве аргумента функции.

# In Linux
import subprocess
subprocess.call('cp source.txt target.txt', shell=True)
# In Windows
import subprocess
subprocess.call('copy source.txt target.txt', shell=True)

Ссылки

  • https://docs.python.org/3/library/subprocess.html#subprocess.call
  • https://docs.python.org/2/library/os.html
  • https://docs.python.org/3/library/shutil.html
  • https://stackoverflow.com/questions/123198/how-do-i-copy-a-file-in-python

3. Использование Python в Windows — документация Python 3.9.1

Цель этого документа — дать обзор поведения Windows, которое вам следует знать об использовании Python в Microsoft Windows.

В отличие от большинства систем и служб Unix, Windows не включает систему поддерживала установку Python. Чтобы сделать Python доступным, команда CPython на протяжении многих лет компилирует установщики Windows (пакеты MSI) для каждого выпуска. Эти установщики в первую очередь предназначены для добавления установки Python для каждого пользователя с основной интерпретатор и библиотека, используемые одним пользователем.Установщик также возможность установки для всех пользователей одной машины, а отдельный ZIP-файл доступен для локальных приложений.

Как указано в PEP 11 , версия Python поддерживает только платформу Windows. в то время как Microsoft считает, что платформа находится под расширенной поддержкой. Это значит, что Python 3.9 поддерживает Windows 8.1 и новее. Если вам требуется Windows 7 поддержки, установите Python 3.8.

Для Windows доступно несколько различных установщиков, каждый с определенные преимущества и недостатки.

Полная программа установки содержит все компоненты и является лучшим вариантом для разработчики, использующие Python для любого проекта.

Пакет Microsoft Store — это простая установка Python, подходящая для запуск сценариев и пакетов, а также использование IDLE или других сред разработки. Требуется Windows 10, но его можно безопасно установить, не повреждая другие программы. Он также предоставляет множество удобных команд для запуска Python и его инструменты.

Nuget.пакеты org — это легкие установки, предназначенные для непрерывного системы интеграции. Его можно использовать для сборки пакетов Python или запуска скриптов, но не обновляется и не имеет инструментов пользовательского интерфейса.

Встраиваемый пакет — это минимальный пакет Python, подходящий для встраивание в более крупное приложение.

3.1. Полный установщик

3.1.1. Этапы установки

Для загрузки доступны четыре установщика Python 3.9 — по два для каждого 32-битные и 64-битные версии интерпретатора.Веб-установщик — это небольшой начальная загрузка, и он автоматически загрузит необходимые компоненты как необходимо. Автономный установщик включает компоненты, необходимые для установка по умолчанию и требуется только подключение к Интернету для дополнительного функции. См. Раздел Установка без загрузки, чтобы узнать о других способах избежать загрузки. во время установки.

После запуска установщика можно выбрать один из двух вариантов:

Если вы выбрали «Установить сейчас»:

  • Вам не не нужно быть администратором (если не обновление системы для Требуется библиотека времени выполнения C или вы устанавливаете Python Launcher для Windows для всех пользователей)

  • Python будет установлен в вашу пользовательскую директорию

  • Программа запуска Python для Windows будет установлена ​​в соответствии с опцией внизу первой страницы

  • Будут установлены стандартная библиотека, набор тестов, программа запуска и пип

  • Если выбрано, установочный каталог будет добавлен в ваш PATH

  • Ярлыки будут видны только текущему пользователю

Выбор «Настроить установку» позволит вам выбрать функции для install, место установки и другие параметры или действия после установки.Чтобы установить символы отладки или двоичные файлы, вам нужно будет использовать эту опцию.

Чтобы выполнить установку для всех пользователей, выберите «Настроить установка». В данном случае:

  • Вам может потребоваться предоставить административные учетные данные или разрешение

  • Python будет установлен в каталог Program Files

  • Программа запуска Python для Windows будет установлена ​​в каталог Windows

  • Дополнительные функции могут быть выбраны во время установки

  • Стандартная библиотека может быть предварительно скомпилирована в байт-код

  • Если выбрано, каталог установки будет добавлен в систему ПУТЬ

  • Ярлыки доступны для всех пользователей

3.1.2. Снятие ограничения MAX_PATH

Windows исторически имеет ограниченную длину пути до 260 символов. Это означало, что пути длиннее этого не разрешатся, и возникнут ошибки.

В последних версиях Windows это ограничение можно расширить до примерно 32 000 знаков. Вашему администратору необходимо будет активировать Групповая политика «Включить длинные пути Win32» или установить LongPathsEnabled на 1 в ключе реестра HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ FileSystem .

Это позволяет использовать функцию open () , модуль os и большинство других функциональность пути для принятия и возврата путей длиной более 260 символов.

После изменения вышеуказанного параметра дальнейшая настройка не требуется.

Изменено в версии 3.6: в Python включена поддержка длинных путей.

3.1.3. Установка без UI

Все параметры, доступные в пользовательском интерфейсе установщика, также можно указать в командная строка, позволяющая установщикам по сценариям реплицировать установку на многих машины без взаимодействия с пользователем.Эти параметры также можно установить без подавление пользовательского интерфейса для изменения некоторых значений по умолчанию.

Чтобы полностью скрыть пользовательский интерфейс установщика и установить Python без вывода сообщений, передайте / тихий вариант . Чтобы пропустить взаимодействие с пользователем, но по-прежнему отображать прогресс и ошибки, передайте опцию / пассивный . / удалить может быть передана опция, чтобы немедленно начать удаление Python — никаких подсказок не будет. отображается.

Все остальные параметры передаются как имя = значение , где обычно значение 0 , чтобы отключить функцию, 1 , чтобы включить функцию, или путь.Полный список доступных вариантов показано ниже.

Имя

Описание

По умолчанию

Установить все пользователи

Выполните общесистемную установку.

0

TargetDir

Каталог установки

Выбрано на основе InstallAllUsers

DefaultAllUsersTargetDir

Каталог установки по умолчанию для установок всех пользователей

% ProgramFiles% \ Python X.Y или % ProgramFiles (x86)% \ Python X.Y

DefaultJustForMeTargetDir

Каталог установки по умолчанию для только для меня устанавливает

% LocalAppData% \ Programs \ PythonXY или % LocalAppData% \ Programs \ PythonXY-32 или % LocalAppData% \ Programs \ PythonXY-64

DefaultCustomTargetDir

Каталог пользовательской установки по умолчанию отображается в пользовательском интерфейсе

(пустой)

AssociateFiles

Создать ассоциации файлов, если лаунчер тоже установлен.

1

CompileAll

Скомпилировать все файлы .py в .pyc .

0

PrependPath

Добавить каталоги установки и скриптов до PATH и .PY до ПУТЬ

0

Ярлыки

Создать ярлыки для интерпретатора, документация и IDLE, если он установлен.

1

Include_doc

Руководство по установке Python

1

Include_debug

Установить двоичные файлы отладки

0

Include_dev

Установите заголовки разработчика и библиотеки

1

Include_exe

Установите python.exe и связанные файлы

1

Include_launcher

Установите Python Launcher для Windows.

1

УстановитьLauncherAllUsers

Устанавливает Python

Добро пожаловать в документацию PyFilesystem2! — PyFilesystem 2.4.12 документация

PyFilesystem

самый последний

  • Введение
  • Направляющая
  • Концепции
  • Информация о ресурсе
  • URL-адреса FS
  • Ходьба
  • Глобус
  • Встроенные файловые системы
  • Реализация файловых систем
  • Создание расширения
  • Внешние файловые системы
  • API PyFilesystem
  • Артикул
PyFilesystem
  • Документы »
  • Добро пожаловать в документацию PyFilesystem2!
  • Редактировать на GitHub

В комплекте:

  • Введение
    • Установка
  • Руководство
    • Зачем использовать PyFilesystem?
    • Открытие файловых систем
    • Печать дерева
    • Закрытие
    • Справочная информация
    • Подкаталоги
    • Работа с файлами
    • Ходьба
    • Глобус
    • Перемещение и копирование
  • Концепции
    • Пути
    • Системные пути
    • Песочница
    • Ошибки
  • Информация о ресурсе
    • Информационные объекты
    • Пространства имен
    • Отсутствуют пространства имен
    • Необработанная информация
  • URL-адреса FS
    • Формат
    • Параметры URL
    • Открытие FS URLS
  • Ходьба
    • Методы ходьбы
    • Алгоритмы поиска
  • Глобализация
    • Сопоставление файлов и каталогов
    • Интерфейс
    • Пакетные методы
  • Встроенные файловые системы
    • Файловые системы приложений
    • Файловая система FTP
    • Файловая система памяти
    • Смонтировать файловую систему
    • Многофайловая система
    • Файловая система ОС
    • Подфайловая система
    • Файловая система Tar
    • Временная файловая система
    • Zip-файловая система
  • Реализация файловых систем
    • Конструктор
    • Безопасность резьбы
    • Версии Python
    • Тестирование файловых систем
    • Основные методы
    • Несущественные методы
    • Вспомогательные методы
  • Создание расширения
    • Соглашение об именах
    • Открывалка
    • Установка.py файл
    • Передовой опыт
    • Сообщите нам
    • Живой пример
  • Внешние файловые системы
  • API PyFilesystem
  • Артикул
    • fs.base
    • fs.compress
    • фс. Копия
    • fs.enums
    • фс. Ошибки
    • фс, глобальный
    • фс. Информация
    • FS Размер файла
    • fs. Зеркало
    • фс. Движение
    • fs. режим
    • fs.opener
    • fs.path
    • фс.разрешения
    • fs. инструменты
    • фс. Дерево
    • фс. Ходьбы
    • fs.wildcard
    • фс. Обертка
    • fs

Учебники по программированию на Python


Возврат файлов с помощью Flask send_file Tutorial

В этом руководстве по веб-разработке Flask мы собираемся обсудить, как возвращать файлы, а не шаблоны.

Допустим, у нас есть страница с кнопкой загрузки для какого-то файла:

__init__.py
 из фляги import send_file

# ... другой код ....

@ app.route ('/ файл-загрузки /')
def file_downloads ():
пытаться:
вернуть render_template ('downloads.html')
кроме исключения как e:
возврат ул (д) 
templates / downloads.html
 {% extends "header.html"%}
{% block body%}

    
{% endblock%} 

Мы видим, что отправляем человека в / return-files /, которого пока нет, давайте сделаем это.

__init__.py
 @ app.route ('/ return-files /')
def return_files_tut ():
пытаться:
return send_file ('/ var / www / PythonProgramming / PythonProgramming / static / images / python.jpg', attachment_filename = 'python.jpg')
кроме исключения как e:
возврат ул (д) 

В этом случае, если человек зайдет в / file-downloads / и нажмет кнопку загрузки, он получит изображение. Как насчет PDF?

 @ app.route ('/ return-files /')
def return_files_tut ():
пытаться:
return send_file ('/ var / www / PythonProgramming / PythonProgramming / static / ohhey.pdf ', attachment_filename =' ohhey.pdf ')
кроме исключения как e:
возврат ул (д) 

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

Следующий учебник: Защищенные каталоги с помощью Flask Tutorial

Как выполнить команду оболочки с помощью Python и использовать ее вывод

Python — отличный язык сценариев.Все больше и больше системных администраторов используют сценарии Python для автоматизации своей работы.

Поскольку задачи системного администратора всегда связаны с командами Linux, выполнение команд Linux из сценария Python очень помогает.

В этом руководстве я покажу вам несколько способов запуска команд оболочки и получения их вывода в программе Python.

Выполнить команду оболочки в Python с модулем os

Позвольте мне создать простую программу на Python, которая выполняет команду оболочки с модулем os.

  импорт ОС
myCmd = 'ls -la'
os.system (myCmd)  

Теперь, если я запускаю эту программу, вот что я вижу в выводе.

  python prog.py
всего 40
drwxr-xr-x 3 abhishek abhishek 4096 17 января, 15:58.
drwxr-xr-x 49 abhishek abhishek 4096 17 января 15:05 ..
-r - r - r-- 1 abhishek abhishek 456 11 декабря 21:29 agatha.txt
-rw-r - r-- 1 abhishek abhishek 0 17 янв 12:11 count
-rw-r - r-- 1 abhishek abhishek 14 янв 10, 16:12 count1.txt
-rw-r - r-- 1 abhishek abhishek 14 янв 10, 16:12 count2.текст
--w-r - r-- 1 abhishek abhishek 356 17 января, 12:10 file1.txt
-rw-r - r-- 1 abhishek abhishek 356 17 декабря 09:59 file2.txt
-rw-r - r-- 1 abhishek abhishek 44 17 января, 15:58 prog.py
-rw-r - r-- 1 абхишек абхишек 356 11 декабря 21:35 sherlock.txt
drwxr-xr-x 3 abhishek abhishek 4096 4 января 20:10 target  

Это содержимое каталога, в котором хранится prog.py.

Если вы хотите использовать вывод команды оболочки, вы можете сохранить ее в файле непосредственно из команды оболочки:

  import os
myCmd = 'ls -la> out.текст'
os.system (myCmd)  

Вы также можете сохранить вывод команды оболочки в переменной следующим образом:

  import os
myCmd = os.popen ('ls -la'). читать ()
print (myCmd)  

Если вы запустите указанную выше программу, она распечатает содержимое переменной myCmd, и оно будет таким же, как вывод команды ls, которую мы видели ранее.

Теперь давайте посмотрим на другой способ запуска команды Linux в Python.

Выполнить команду оболочки в Python с модулем подпроцесса

Немного лучший способ выполнения команд оболочки в Python — использовать модуль подпроцесса.

Если вы хотите запустить команду оболочки без каких-либо параметров и аргументов, вы можете вызвать подпроцесс следующим образом:

  import subprocess
subprocess.call ("ls")  

Метод call выполнит команду оболочки. Вы увидите содержимое текущего рабочего каталога при запуске программы:

  python prog.py
agatha.txt count1.txt file1.txt prog.py target
count count2.txt file2.txt sherlock.txt  

Если вы хотите указать параметры и аргументы вместе с командой оболочки, вам нужно будет указать их в виде списка.

  импорт подпроцесса
subprocess.call (["ls", "-l", "."])  

Когда вы запустите программу, вы увидите содержимое текущего каталога в формате списка.

Теперь, когда вы знаете, как запускать команду оболочки с подпроцессом, возникает вопрос о сохранении вывода команды оболочки.

Для этого вам нужно использовать функцию Popen. Он выводится в объект Popen, у которого есть метод communication (), который можно использовать для получения стандартного вывода и ошибки в виде кортежа.Вы можете узнать больше о модуле подпроцесса здесь.

  импорт подпроцесса
MyOut = subprocess.Popen (['ls', '-l', '.'],
            stdout = subprocess.PIPE,
            stderr = subprocess.STDOUT)
stdout, stderr = MyOut.communicate ()
печать (стандартный вывод)
print (stderr)  

Когда вы запустите программу, вы увидите stdout и stderr (в данном случае их нет).

  python prog.py
 всего 32
 -r - r - r-- 1 abhishek abhishek 456 11 декабря 21:29 agatha.txt
 -rw-r - r-- 1 abhishek abhishek 0 17 янв 12:11 count
 -rw-r - r-- 1 abhishek abhishek 14 янв 10, 16:12 count1.текст
 -rw-r - r-- 1 abhishek abhishek 14 янв 10, 16:12 count2.txt
 --w-r - r-- 1 abhishek abhishek 356 17 января, 12:10 file1.txt
 -rw-r - r-- 1 abhishek abhishek 356 17 декабря 09:59 file2.txt
 -rw-r - r-- 1 abhishek abhishek 212 17 января, 16:54 prog.py
 -rw-r - r-- 1 abhishek abhishek 356 11 декабря 21:35 sherlock.txt
 drwxr-xr-x 3 abhishek abhishek 4096 4 января 20:10 target

Нет  

Я надеюсь, что этот быстрый совет помог вам выполнить команду оболочки в программах Python.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *