如何在pathlib中使用分隔符访问另一个文件/文件夹

2024-05-23 19:37:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,可以根据一天中的当前时间(白天或晚上)更改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来使用工作目录中的任何文件/目录


Tags: andthetopathinfortimenotification
2条回答

错误表明无法连接str和WindowsPath, 尝试使用:

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

pathlib与您使用它的方式不一样。
当使用pathlib时,可以避免您自己添加分隔符,并且可以使用/运算符(在包中被重写)连接路径

你应该试试:

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

相关问题 更多 >