【发布时间】:2014-12-31 08:17:10
【问题描述】:
在具有长文件名的 Windows 上获取命令行参数并将其传递给函数时遇到问题。
简而言之,包含空格的长文件名被分成不同的部分。
我制作了一段代码,将命令行作为一个整体提供给我,但它远非理想,因为它适用于多个参数,但不适用于带有空格的 LFN。 (杂物是为不同的脚本制作的,我刚刚将它复制到了这个) 我一直在谷歌上搜索几个小时试图弄清楚这一点,因为肯定有人已经解决了这个问题。 我尝试过使用 ArgParse,但也无法在不拆分文件的情况下给我文件名。
谁能给我展示一些代码,演示如何完全按照原样获取命令行(减去脚本名称)并获取完整的文件名。
谢谢, 亚当
[编辑..] 我试着在它周围加上引号,但它仍然失败了。我通过测试代码知道它在空格上拆分输入并删除引号。 来自不同测试的示例:
test.py 代码:
import sys
print ('Number of arguments:', len(sys.argv), 'arguments.')
print ('Argument List:', str(sys.argv))
for x in range(0, len(sys.argv)):
print("->" + sys.argv[x])
输出:
H:\bin>test "test lfn.txt"
Number of arguments: 3 arguments.
Argument List: ['H:\\bin\\test.py', ' test', 'lfn.txt']
->H:\bin\test.py
-> test
->lfn.txt
#
[编辑 2] 我认为这是 Windows 上的 Python 错误,因为双引号有效,有点:
H:\bin>test ""test lfn.txt""
Number of arguments: 2 arguments.
Argument List: ['H:\\bin\\test.py', ' "test lfn.txt"']
->H:\bin\test.py
-> "test lfn.txt"
原始代码贴在下面。
###############################################################################
# Renames a single file to ISO date format: YYYYMMDD-HHMMSS #
###############################################################################
import datetime, os, sys
def error_filename():
print("filename doesn't exist maybe.")
sys.exit(1)
def error_args():
print("Renames a single file to ISO date format: YYYYMMDD-HHMMSS")
print("Requires 1 parameter, the filename to rename")
sys.exit(2)
def error_rename():
print("Unable to rename")
sys.exit(3)
cmds = ""
for x in range(1, len(sys.argv)):
cmds = cmds + sys.argv[x]
cmds = cmds.strip()
if cmds != "":
d = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
if os.path.isfile(cmds):
fn = cmds.split(os.extsep)
fn[0]=d
newname = d + "." + fn[1]
print(cmds + " -> " + newname)
try:
os.rename(cmds, newname)
except:
error_rename()
else:
error_filename()
else:
error_args()
【问题讨论】:
-
我们不知道您的输入是什么样的。
-
您是否将命令行中的文件名括在引号内?如果没有,那就这样做。否则空格是一个参数分隔符 - 它与长度无关。
-
你的第一个循环可以写成
cmd = ' '.join(sys.arg[1:]),但是如果文件名包含制表符,或者每个组件之间有两个空格会发生什么?您的设计只有在只使用一个空间时才能发挥作用。
标签: python python-3.x command-line command-line-arguments long-filenames