Программа проверяет, существует ли файл перед его созданием - PullRequest
0 голосов
/ 01 апреля 2019

У меня проблема с кодом, который я пишу.Одна из его частей отвечает за создание файла, и он также должен сказать мне, был ли он успешным.Если нет, он также должен проинформировать меня, но проблема в том, что он проверяет, существует ли файл, прежде чем он будет создан.Я попытался сделать перерыв между созданием файла и проверкой, существует ли он, используя модуль времени (в частности, опцию time.sleep, вставляемую практически во всех возможных местах), но безрезультатно.Я также попытался использовать другой способ проверить, существует ли файл.Это не помогло.Все работает нормально (за исключением этой части), потому что, если файл уже существует, и я говорю программе, чтобы он был создан, он говорит мне, что он был успешным, поэтому он может правильно его прочитать, но он слишком быстрый.Я приложил часть своего кода внизу.Заранее спасибо.

Первый способ, который я попробовал, используя модуль os:

path = 'D:\screen'

os.chdir(path)

exists = os.path.isfile('.\screenshot.png')
exists2 = os.path.isfile('.\screenshot2.png')

И вот часть выполнения:

def printer():
    pyautogui.screenshot('D:\SCREEN\screenshot.png')
    time.sleep(3)
    if exists:
        print("Screenshot was created successfully")
    else:
        print("Screenshot was not created successfully")

def printer2():
    pyautogui.screenshot('D:\SCREEN\screenshot2.png')
    time.sleep(3)
    if exists2:
        print ("Screenshot was created successfully")
    else:
        print ("Screenshot was not created successfully")

Второй способ, который я попробовал, используяpathlib:

path = 'D:/screen'

file1 = Path("D:/screen/screenshot.png")
file2 = Path("D:/screen/screenshot2.png")

И исполняющая часть:

def printer():
    pyautogui.screenshot('D:/SCREEN/screenshot.png')
    time.sleep(3)
    if file1.isfile():
        print("Screenshot was created successfully")
    else:
        print("Screenshot was not created successfully")


def printer2():
    pyautogui.screenshot('D:/SCREEN/screenshot2.png')
    time.sleep(3)
    if file2.isfile():
        print("Screenshot was created successfully")
    else:
        print("Screenshot was not created successfully")

Ответы [ 4 ]

1 голос
/ 01 апреля 2019

Эти переменные (file1, file2) были назначены до создания снимка экрана, поэтому они не существуют. screenshot фактически возвращает объект изображения PIL. Так что вы можете проверить, даже не используя os.

def printscreen():
    try:
        image = pyautogui.screenshot('D:/SCREEN/screenshot.png')
    except Exception as e:
        print(f'Exception occured during screenshotring {str(e)}')

Если вы все еще хотите проверить с помощью os, существуют ли они после скриншота.

pyautogui.screenshot('D:/SCREEN/screenshot.png')
assert os.file.exist('D:/SCREEN/screenshot.png')
0 голосов
/ 02 апреля 2019

Спасибо за все ваши ответы. Я смог справиться со своей проблемой, используя решение, предложенное Zonyl. Похоже, что причина, стоящая за этим, была тривиальной (,, Эти переменные (file1, file2) были назначены до создания снимка экрана ",, Предполагая, что первая половина каждой попытки выполняется до вызова функций принтера, вы сохраняете результат os.path.isfile () до того, как вы создали файл, который вы тестируете. ") но я благодарен, что вы все равно помогли мне. Я надеюсь, что другой новичок в будущем может найти это полезным.

0 голосов
/ 01 апреля 2019

Добро пожаловать в SO!

Лучше всего проверить, существует ли файл или нет, использует блок try/catch. Проблема в коде заключается в том, что они находятся в состоянии гонки между строкой os.path.isfile('.\screenshot.png') иif exists часть.

Вы можете попробовать использовать следующее -

  try:
      fh = open('.\screenshot.png', 'rw'):
      # Do something
  except FileNotFoundError:
      print("File not found")
0 голосов
/ 01 апреля 2019

Я понятия не имею, что делает pyautogui.screenshot (), но здесь идет речь:

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

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

В printer и printer2 первой половины вы можете изменить существующий / существующий2 на вызов os.path.isfile ().

В простом случае это должно работать:

def printer():
    pyautogui.screenshot('D:\screen\screenshot.png') #assume this attempts to create a file
    if os.path.isfile('.\screenshot.png'):
        print("Screenshot was created successfully")
    else:
        print("Screenshot was not created successfully")

path = 'D:\screen'
os.chdir(path)    
printer()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...