Eu preciso usar md5sum
no Python usando pipe para calcular a soma de verificação para um monte de arquivos .mp3 ... existe um comando que ignora espaços em branco nos nomes de arquivos na linha de comando do md5sum
programa?
Por exemplo:
import os
def index(directory):
stack = [directory]
files = []
while stack:
directory = stack.pop()
for file in os.listdir(directory):
fullname = os.path.join(directory, file)
if fullname.endswith('mp3'):
files.append(fullname)
if os.path.isdir(fullname) and not os.path.islink(fullname):
stack.append(fullname)
return files
def check(directory):
files = index(directory)
hvalues = []
for x in files:
cmd = 'md5sum' + ' ' + x
fp = os.popen(cmd)
res = fp.readline()
hvalues.append(res)
stat = fp.close() # What to do with stat?
return hvalues
O comando cmd = 'md5sum' + ' ' + x
não funcionará como deveria nos arquivos que incluem espaços em branco ou caracteres especiais, porque a ferramenta 'md5sum' não possui a capacidade de manipular corretamente arquivos (hash) com espaços em branco nos nomes de arquivos.
Respostas:
Isso não é falta de habilidades,
md5tool
mas uma restrição geral à linha de comando. Os argumentos são separados por espaços. Portanto, se você passar um nome de arquivo contendo espaços,md5sum
ele interpretará cada token como um único arquivo. Você pode contornar isso colocando o nome do arquivo entre aspas. Dito isto, tente substituir a linhacom
e sua chamada de linha de comando será semelhante
Assim,
md5sum
calculará o hash sem reclamar.fonte
Como o @binfalse aponta, o problema não está no
md5sum
programa, mas na maneira como você o invocou. Seu código é realmente ruim em vários níveis:Você montou um comando shell sem escapar. Na pior das hipóteses, isso pode levar à execução de um comando completamente não intencional, se um dos nomes de arquivos for criado de maneira inteligente. Isso seria horrível, a menos que você esteja escrevendo um script descartável de uso único.
A
os.popen()
função está obsoleta desde o Python 2.6. A substituição recomendada ésubprocess.Popen()
. Certifique-se de passar uma lista como oargs
parâmetro, não uma sequência concatenada, para evitar o problema de escape de shell mencionado anteriormente.Melhor ainda, use o Python
hashlib
para calcular os hashes.fonte
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) NameError: global name 'subprocess' is not defined
embora eu tenha declaradofrom subprocess import Popen, PIPE
na primeira linha ...