Как использовать разделители в pathlib для доступа к другому файлу/папке

#python #ctypes #pathlib

Вопрос:

У меня есть скрипт, который изменяет фоновое изображение Windows с учетом текущего времени суток (дня или ночи). Я хотел сделать этот скрипт масштабируемым, чтобы его можно было использовать на другом компьютере без каких-либо изменений в коде.

 from datetime import datetime, time
import pandas
import ctypes
from pathlib import Path

file_path = "myfile.xlsx" #sunrise/sunset file path
print(file_path)
data = pandas.read_excel(file_path, header=0) #Header on line 0

#Today as day number in reference to 1st of Jan
day = datetime.now().timetuple().tm_yday

#Today's parameters
#sr and ss are column names in the Excel spreadsheet for sunrise and sunset respectively
#Minus 1 to account for 0 based indexing
sunrise = data["sr"][day - 1]
sunset = data["ss"][day - 1] 

#Function to convert time objects into integers
def seconds_in_time(time_value: time):
    return (time_value.hour * 60   time_value.minute) * 60   time_value.second

notification_minutes = 5
notification_seconds = notification_minutes * 60
#Variable for a moment in time 5 minutes before the sunset
sunset_minus_five = seconds_in_time(sunset) - notification_seconds

#Setting up the day_night variable depending on the now variable
#delta calculates the difference in seconds between now and sunset -during night- and sunrise -during day-
#A negative value for delta means that now variable is equal to any moment between midnight and the sunrise  
if now > sunrise and now < sunset:
    day_night = 'day'
    delta = (seconds_in_time(now) - seconds_in_time(sunrise))
else:
    day_night = 'night'
    delta = (seconds_in_time(now) - seconds_in_time(sunset))
    
#delta_notification calculates the difference in seconds between now and sunset_minus_five
delta_notification = seconds_in_time(now) - sunset_minus_five

abs_path = Path().resolve()
print(abs_path)
sep = '\'
target_path = abs_path   sep   day_night   '.jpg'
print(target_path)

#Function to change the wallpaper
def changeBG(target_path):
    ctypes.windll.user32.SystemParametersInfoW(20, 0, path, 3) #SystemParametersInfoW for x64 architecture

#Wallpaper when code is ran user log on
#changeBG(target_path)
 

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

 TypeError                                 Traceback (most recent call last)
<ipython-input-11-ca377c654d5c> in <module>
     42 print(abs_path)
     43 sep = '\'
---> 44 target_path = abs_path   sep   day_night   '.jpg'
     45 print(target_path)
     46 

TypeError: unsupported operand type(s) for  : 'WindowsPath' and 'str'
 

Прежде чем перейти к этому pathlib подходу, я попробовал статический подход с:

 path = 'C:\Users\myuser\Desktop\Sunset\wallpapers_desktop_only\'  day_night  '\'  vmc_imc_day_night()  '.jpg'

#Function to change the wallpaper
def changeBG(path):
    ctypes.windll.user32.SystemParametersInfoW(20, 0, path, 3) #SystemParametersInfoW for x64 architecture
 

Это сработало без каких-либо проблем , так ctypes как ожидаемый разделитель есть \ , но pathlib возвращает меня , который нельзя использовать в качестве строки.

Как я могу использовать pathlib для использования любые файлы/каталоги, которые находятся внутри моего рабочего каталога?

Ответ №1:

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

Тебе стоит попробовать:

 target_path = abs_path / f'{day_night}.jpg'
 

Комментарии:

1. Я уже пробовал это, и теперь у меня получается SyntaxError: unexpected character after line continuation character .

2. Какую версию python вы используете? f-строки поддерживаются на python3.6 и выше. и вы уверены, что используете / , а не»`?

3. Это странно, не могли бы вы прокомментировать код, который вы использовали, и более подробную информацию? вы должны использовать f-strings , а не .format в новых версиях python

4. просто создайте путь, используя pathlib, и при отправке его в качестве параметра используйте функцию ctypes str(target_path) .

5. и path = abs_path / day_night / f'{vmc_imc_day_night()}.jpg' должно сработать

Ответ №2:

Ошибка говорит о том, что вы не можете объединить str и WindowsPath, попробуйте использовать:

 target_path = abs_path / '{}.jpg'.format(day_night)