我正在用Python3编写一些旨在备份Windows客户端上的目录结构并将其发送到Linux服务器的软件。
我遇到的问题是如何处理Windows和Linux文件路径。我需要Windows客户端创建一个代表源文件相对路径的对象,将该相对路径发送到服务器,以便服务器知道将文件写入目标文件夹中的哪个子目录,然后发送实际数据。 / p>
发送实际数据不是问题,但是如何将Windows相对路径发送到Linux系统?我尝试使用os.path
以字符串的形式进行操作,但是很快就变得一团糟。我正在使用pathlib
。
如果我可以创建某种路径对象,则可以使用pickle对其进行序列化,然后将其发送到服务器。我将使用pathlib中的哪个对象来表示路径?
Path()
似乎创建了一个适用于当前文件系统(PosixPath
或WindowsPath
)的类的实例,它们不能移植。如果我在Windows客户端上创建WindowsPath
对象,Linux将无法反序列化它,因为您甚至无法在Linux系统上实例化WindowsPath
对象。
看起来我可以使用PureWindowsPath
对象,并将其发送到Linux,但是如何将PureWindowsPath
对象(代表相对路径)转换为PosixPath
,或至少PurePosixPath
?
有可能吗?还是我在想这一切错了?
答案 0 :(得分:3)
pathlib
是一个OO库,而不是通信协议。 只需发送字符串。
Windows可以很好地处理带有正斜杠的路径,而pathlib
和os.path
都可以为您规范化此类路径。您可能希望规范化协议中的路径以使用POSIX路径分隔符(正斜杠)。
您可以使用pathlib.PurePosixPath()
将相对Windows路径转换为POSIX路径,例如:
>>> from pathlib import Path, PurePosixPath
>>> Path('relative\path\on\windows')
WindowsPath('relative\path\on\windows')
>>> PurePosixPath(_)
PurePosixPath('relative/path/on/windows')
>>> str(_)
'relative/path/on/windows'
如果服务器使用Windows约定接收到相对路径,请使用PureWindowsPath()
将其转换为pathlib
对象,然后将其传递给Path()
进行转换:
>>> from pathlib import Path, PureWindowsPath
>>> received = 'relative\path\on\windows'
>>> PureWindowsPath(received)
PureWindowsPath('relative/path/on/windows')
>>> Path(_)
PosixPath('relative/path/on/windows')
如果将路径保留为字符串,则可以使用str.replace(os.altsep, os.sep)
在Windows端实现相同的目的,然后再发送:
>>> import os
>>> p = 'relative\path\on\windows'
>>> p.replace(os.altsep, os.sep)
'relative/path/on/windows'
,您随时可以使用relative_path.replace('\\', os.sep)
来强制问题。