Python: OSError: [Errno 22] Недопустимый аргумент: '*.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) )
это работает довольно хорошо, когда я ввожу файл:
даже когда я ввожу два файла:
но не при вводе ВСЕХ файлов:
Ошибка говорит:
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
или из-за способа ввода файлов?
2 ответа
Если вы хотите использовать такие вещи, как *, то вы должны "потерять" файлы. Это может сбивать с толку, потому что шатание может происходить во многих местах. Я не знаком с используемой вами оболочкой, но если бы вы использовали bash, то bash выполнил бы глоб, прежде чем он будет передан Python. Другими словами, если *.txt действительно совпадает с чем-то, bash заменяет его списком файлов, а затем передает этот список в Python (в качестве отдельных аргументов). Тогда ваша задача - иметь дело с произвольным числом аргументов в Python (возможно, с использованием argparse). Если *.txt не совпадает ни с чем, тогда он не раскрывается, и Python видит *.txt, и вы должны воспринимать это как ошибку.
Здесь это выглядит так, как будто сглаживание не происходит, что означает либо то, что вашей оболочке ничего не соответствует, либо ваша оболочка не выполняет сглаживание. Если он не выполняет глобирование, вы можете выполнить глобализацию в Python с помощью модуля glob. Тем не менее, обычно глобализация - это то, что делает оболочка.
Пытаясь открыть файл с именем *.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
возвращает пустой список.