scraping read parse example python windows file-attributes

read - python search text in pdf



Python Windows File Version attribute (7)

Puede usar la herramienta filever.exe para hacer eso. Aquí hay un hilo que explica cómo hacerlo desde Python . Y aquí está el artículo de KB con detalles sobre la herramienta.

La última vez hice una pregunta similar, pero eso era sobre la información de versiones relacionadas con svn. Ahora me pregunto cómo consultar el atributo "Versión de archivo" de Windows, por ejemplo. un dll. Presté atención también a los módulos wmi y win32file sin éxito.


Encontré esta solución en el sitio "timgolden". Funciona bien.

from win32api import GetFileVersionInfo, LOWORD, HIWORD def get_version_number (filename): info = GetFileVersionInfo (filename, "//") ms = info[''FileVersionMS''] ls = info[''FileVersionLS''] return HIWORD (ms), LOWORD (ms), HIWORD (ls), LOWORD (ls) if __name__ == ''__main__'': import os filename = os.environ["COMSPEC"] print ".".join ([str (i) for i in get_version_number (filename)])


Es mejor agregar una prueba / excepto en caso de que el archivo no tenga ningún atributo de número de versión.

filever.py

from win32api import GetFileVersionInfo, LOWORD, HIWORD def get_version_number (filename): try: info = GetFileVersionInfo (filename, "//") ms = info[''FileVersionMS''] ls = info[''FileVersionLS''] return HIWORD (ms), LOWORD (ms), HIWORD (ls), LOWORD (ls) except: return 0,0,0,0 if __name__ == ''__main__'': import os filename = os.environ["COMSPEC"] print ".".join ([str (i) for i in get_version_number (filename)])

yourscript.py:

import os,filever myPath="C://path//to//check" for root, dirs, files in os.walk(myPath): for file in files: file = file.lower() # Convert .EXE to .exe so next line works if (file.count(''.exe'') or file.count(''.dll'')): # Check only exe or dll files fullPathToFile=os.path.join(root,file) major,minor,subminor,revision=filever.get_version_number(fullPathToFile) print "Filename: %s /t Version: %s.%s.%s.%s" % (file,major,minor,subminor,revision)

¡Aclamaciones!


Puede usar el módulo pyWin32 de http://sourceforge.net/projects/pywin32/ :

from win32com.client import Dispatch ver_parser = Dispatch(''Scripting.FileSystemObject'') info = ver_parser.GetFileVersion(path) if info == ''No Version Information Available'': info = None


Aquí hay una función que lee todos los atributos de archivo como un diccionario:

import win32api #============================================================================== def getFileProperties(fname): #============================================================================== """ Read all properties of the given file return them as a dictionary. """ propNames = (''Comments'', ''InternalName'', ''ProductName'', ''CompanyName'', ''LegalCopyright'', ''ProductVersion'', ''FileDescription'', ''LegalTrademarks'', ''PrivateBuild'', ''FileVersion'', ''OriginalFilename'', ''SpecialBuild'') props = {''FixedFileInfo'': None, ''StringFileInfo'': None, ''FileVersion'': None} try: # backslash as parm returns dictionary of numeric info corresponding to VS_FIXEDFILEINFO struc fixedInfo = win32api.GetFileVersionInfo(fname, ''//') props[''FixedFileInfo''] = fixedInfo props[''FileVersion''] = "%d.%d.%d.%d" % (fixedInfo[''FileVersionMS''] / 65536, fixedInfo[''FileVersionMS''] % 65536, fixedInfo[''FileVersionLS''] / 65536, fixedInfo[''FileVersionLS''] % 65536) # /VarFileInfo/Translation returns list of available (language, codepage) # pairs that can be used to retreive string info. We are using only the first pair. lang, codepage = win32api.GetFileVersionInfo(fname, ''//VarFileInfo//Translation'')[0] # any other must be of the form /StringfileInfo/%04X%04X/parm_name, middle # two are language/codepage pair returned from above strInfo = {} for propName in propNames: strInfoPath = u''//StringFileInfo//%04X%04X//%s'' % (lang, codepage, propName) ## print str_info strInfo[propName] = win32api.GetFileVersionInfo(fname, strInfoPath) props[''StringFileInfo''] = strInfo except: pass return props


Aquí hay una versión que también funciona en entornos que no son de Windows, utilizando el módulo pefile :

import pefile def LOWORD(dword): return dword & 0x0000ffff def HIWORD(dword): return dword >> 16 def get_product_version(path): pe = pefile.PE(path) #print PE.dump_info() ms = pe.VS_FIXEDFILEINFO.ProductVersionMS ls = pe.VS_FIXEDFILEINFO.ProductVersionLS return (HIWORD (ms), LOWORD (ms), HIWORD (ls), LOWORD (ls)) if __name__ == "__main__": import sys try: print "%d.%d.%d.%d" % get_product_version(sys.argv[1]) except: print "Version info not available. Maybe the file is not a Windows executable"


Aquí hay una versión que no requiere ninguna biblioteca adicional. No pude usar win32api como todos habían sugerido:

De: https://mail.python.org/pipermail//python-list/2006-November/402797.html

Solo se copia aquí en caso de que el original desaparezca.

import array from ctypes import * def get_file_info(filename, info): """ Extract information from a file. """ # Get size needed for buffer (0 if no info) size = windll.version.GetFileVersionInfoSizeA(filename, None) # If no info in file -> empty string if not size: return '''' # Create buffer res = create_string_buffer(size) # Load file informations into buffer res windll.version.GetFileVersionInfoA(filename, None, size, res) r = c_uint() l = c_uint() # Look for codepages windll.version.VerQueryValueA(res, ''//VarFileInfo//Translation'', byref(r), byref(l)) # If no codepage -> empty string if not l.value: return '''' # Take the first codepage (what else ?) codepages = array.array(''H'', string_at(r.value, l.value)) codepage = tuple(codepages[:2].tolist()) # Extract information windll.version.VerQueryValueA(res, (''//StringFileInfo//%04x%04x//' + info) % codepage, byref(r), byref(l)) return string_at(r.value, l.value)

Usado así:

print get_file_info(r''C:/WINDOWS/system32/calc.exe'', ''FileVersion'')