Python: OSError: [Errno 22] Invalid argument: '*.txt'

Python: OSError: [Errno 22] Invalid argument: '*.txt'

我想使用一个脚本来枚举文件夹中的所有文件类型:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import argparse
import magic
import os

# Argparse starts here
parser = argparse.ArgumentParser()                              
parser.add_argument('-input', dest='input',help="input one or more files",nargs='+',metavar=None)                           
args = parser.parse_args()

for files in args.input:
    if magic.from_file(files,mime=True) == "text/plain":
        print (files, "=" , magic.from_file(files,mime=True) )

当我输入一个文件时它工作得很好:

即使我输入了两个文件:

但当我输入 ALL 文件时不是:

错误说:

Traceback (most recent call last):
  File "Test.py", line 15, in <module>
    if magic.from_file(files,mime=True) == "text/plain":
  File "C:\Users\FrancescoM\AppData\Local\Programs\Python\Python36-32\lib\site-packages\magic\magic.py", line 135, in from_file
    return m.from_file(filename)
  File "C:\Users\FrancescoM\AppData\Local\Programs\Python\Python36-32\lib\site-packages\magic\magic.py", line 85, in from_file
    with open(filename):
OSError: [Errno 22] Invalid argument: '*.txt'

但是*.txt正是我要输入的;我也想输入任何文件 *.*

这是与 python-magic 相关的问题还是由我输入文件的方式引起的?

试图打开名为 *.txt 的文件毫无意义。 open 不支持使用通配符打开多个文件。

如果你想在每个文件上循环,你必须为此执行多次打开,使用 glob.glob 到 return 匹配的文件名

import glob
for fexp in glob.glob(filename):
    with open(fexp) as f:
      # do something with the opened file
      pass

注意,如果目录错误,glob.glob return是一个空列表。

如果您想使用 * 之类的东西,则必须 "glob" 这些文件。这可能会造成混淆,因为通配可能发生在很多地方。我不熟悉您正在使用的 shell,但是如果您使用的是 bash,那么 bash 会在 before 之前执行 glob,它会通过到 Python。换句话说,如果 *.txt 实际上匹配某些内容,bash 将其替换为文件列表,然后将该列表传递给 Python(作为单独的参数)。然后你的工作就是处理 Python 中任意数量的参数(可能使用 argparse)。如果 *.txt 不匹配任何内容,则它不会展开并且 Python 看到 *.txt,您必须将其作为错误处理。

这里似乎没有发生通配,这意味着您的 shell 没有任何匹配项,或者您的 shell 没有进行通配。如果它不进行通配,那么您可以使用 glob 模块在 Python 中进行通配。不过,通配符通常是由 shell 完成的。