【问题标题】:How to pass wildcard argument like *.txt in windows cmd如何在 Windows cmd 中传递 *.txt 等通配符参数
【发布时间】:2014-02-12 14:43:20
【问题描述】:

我的目录树:

test/
|_____ 1.txt   content: 1_line1\n1_line2
|_____ 2.txt   content: 2_line1\n2_line2
|_____ test_fileinput.py

我的 Python 脚本:

import fileinput
import sys

for line in fileinput.input(sys.argv[1:]):
     print(fileinput.filename(), fileinput.filelineno(), line)

首先我在 Linux 上进行了尝试,正如您所见,它完美无缺:

$ python3 test_fileinput.py *.txt
1.txt 1 1_line1

1.txt 2 1_line2
2.txt 1 2_line1

2.txt 2 2_line2

但在 Windows 上:

我当然可以python test_fileinput.py 1.txt 2.txt,但我想知道有没有办法在Windows 上仍然可以通过*.txt?谢谢。

【问题讨论】:

标签: python windows


【解决方案1】:

您可以使用glob 模块,它提供了一种与平台无关的通配符匹配方式。例如,glob('*.txt') 将返回当前目录中所有 txt 文件的列表。

import fileinput
import sys
from glob import glob

for line in fileinput.input(glob(sys.argv[1]):
     print(fileinput.filename(), fileinput.filelineno(), line)

如果您想保留可以指定多个输入的行为(以便执行python test_fileinput.py *.txt *.csv other.md 将是有效行为),您可以修改您的代码如下:

import fileinput
import sys
from glob import glob

all_files = [f for files in sys.argv[1:] for f in glob(files)]

for line in fileinput.input(all_files):
     print(fileinput.filename(), fileinput.filelineno(), line)

【讨论】:

  • glob 很棒,我知道,但这与我的要求略有不同。
  • 所以如果不使用glob 之类的东西,在Windows 中就无法做到这一点,对吧?如果你确定,那么我会接受你的回答。
  • @laike9m -- 我相当肯定使用标准的 Windows 命令行或 Powershell 都不可能。我在网上粗略搜索了一下,貌似windows原生不支持通配符扩展。
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 2018-10-29
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多