首页 > 解决方案 > Python3 字符串格式化与 . 在前面失踪

问题描述

我正在尝试编写文件传输程序并尝试制作要跳过处理的文件列表:脚本本身,以及 VI 备份和交换文件(server.py~ 和 .server.py.swp)

我无法获得 vi 交换文件的正确名称 .server.py.swp,开头的点丢失,我得到 server.py.swp

我首先使用 .server.py.swp 硬编码创建列表(我对其他进行了硬编码,但在我为它们工作的字符串格式后删除了它们)。然后我使用字符串格式添加脚本文件和备份文件。我附加字符串“test”用于调试目的并作为分隔符。最后,我尝试使用两种不同的方法添加带有字符串格式的交换文件,并使用前导 . 在前面失踪。

要运行我所指的server.py中的代码,我有一个正在开发的client.py。

客户端.py

import os, socket
port = 7777
host = socket.gethostname()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))

服务器.py

import os, socket

port = 7777
host = socket.gethostname()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(1)

while True:
    clientsocket, address = s.accept()
    print(f"Connection from {address} has been established!!!")
    # https://stackoverflow.com/questions/4934806
    File = os.path.realpath(__file__)
    dir = os.path.dirname(File)
    os.chdir(dir)
    server_files = os.listdir(".")
    skip = [".server.py.swp"]
    # https://pythonguides.com/python-get-filename-from-the-path/
    skip.append(os.path.basename(File))
    skip.append(os.path.basename(f"{File}~"))
    skip.append(f"test")
    skip.append(os.path.basename(f".{File}.swp"))
    skip.append(os.path.basename(".{}.swp".format(File)))
    print(f"Skip:   {skip}")

# !End

我在服务器上得到不正确的输出

Skip: ['.server.py.swp', 'server.py', 'server.py~', 'test', 'server.py.swp', 'server.py.swp']

我想要的输出将类似于

Skip: ['.server.py.swp', 'server.py', 'server.py~', 'test', '.server.py.swp', '.server.py.swp']

我错过了什么吗?我试图逃避 . 通过投入\.无济于事。

编辑:我的目标是跨平台,但现在我正在 Windows 上开发和测试这个。

标签: python-3.xstringstring-formatting

解决方案


鉴于这File似乎是一个合格的路径,而不仅仅是一个文件名,.在调用之前加上前缀basename什么都不做;if Fileis C:\foo\bar.py(会打印额外\的 s) or /foo/bar.pyor even ../relative/bar.py, 前缀 a.将它放在最后的目录分隔符 ( \or /) 之前,它被 . 剥离basename。如果要在文件名前加上前缀,请在剥离目录.添加,例如:

skip.append("." + os.path.basename(f"{File}.swp"))

或者

skip.append(".{}.swp".format(os.path.basename(File)))

推荐阅读