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 完成的。
我想使用一个脚本来枚举文件夹中的所有文件类型:
#!/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 完成的。