-1

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

#!/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) )

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

在此处输入图像描述

即使我输入两个文件:

在此处输入图像描述

但不是当我输入所有文件时:

在此处输入图像描述

错误说:

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我输入文件的方式有关或引起的问题吗?

4

2 回答 2

1

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

这里看起来没有发生通配,这要么意味着你的外壳没有任何东西可以匹配,要么你的外壳不做通配。如果它不做 globbing,那么您可以使用glob模块在 Python 中进行 globbing。不过,通配符通常是由 shell 完成的。

于 2017-12-05T10:24:27.500 回答
0

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

如果要循环每个文件,则必须为此执行多次打开,glob.glob用于返回匹配的文件名

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

请注意,如果目录错误,则glob.glob返回一个空列表。

于 2017-12-05T10:23:05.840 回答