【问题标题】:Python 3 long filename as argument (python splits it)Python 3 长文件名作为参数(python 将其拆分)
【发布时间】: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


【解决方案1】:

我遇到的错误是因为 Windows 7 以前默认在编辑器中打开 python 文件,我在注册表中手动将其更改为使用 python 打开。通过在另一台机器上进行全新安装并让 python 安装程序设置路径等,它工作正常。问题在于 Windows 注册表设置。

【讨论】:

  • 什么编辑器?你的脚本是如何执行的? (编辑器是否以某种方式运行它?)如果其他人有同样的问题,这个答案没有提供足够的信息来解决问题,并且取决于它是什么,这可能是一个应该在编辑器中报告的错误。
猜你喜欢
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2012-03-10
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
相关资源
最近更新 更多