J'essaie de créer un programme dans Python 2.7, qui a les exigences suivantes:
OS.OPEN (FilePath, OS.O_RDWR) CODE> LI>
- traite le fichier. LI>
ol>
Mon algorithme actuel est: p>
- Avoir une liste de toutes les extensions de fichier vidéo. Je les ai eu de ici li>
- boucle via tous les fichiers li>
- Si le fichier a une extension vidéo, procédez-le, processus li>
ol>
Cette méthode a suivi des inconvénients: P>
- Certaines extensions de fichier tels que ".dat" ou ".am" sont utilisés pour des fichiers non multimédias. li>
- Certains fichiers avec des extensions telles que ".dat" sont utilisés par d'autres programmes (c'est-à-dire antivirus) li>
ol>
Que dois-je faire pour faire un programme qui satisfait aux exigences pointées ci-dessus? P>
Voici mon code actuel: p>
def is_video_file(filename):
video_file_extensions = (
'.264', '.3g2', '.3gp', '.3gp2', '.3gpp', '.3gpp2', '.3mm', '.3p2', '.60d', '.787', '.89', '.aaf', '.aec', '.aep', '.aepx',
'.aet', '.aetx', '.ajp', '.ale', '.am', '.amc', '.amv', '.amx', '.anim', '.aqt', '.arcut', '.arf', '.asf', '.asx', '.avb',
'.avc', '.avd', '.avi', '.avp', '.avs', '.avs', '.avv', '.axm', '.bdm', '.bdmv', '.bdt2', '.bdt3', '.bik', '.bin', '.bix',
'.bmk', '.bnp', '.box', '.bs4', '.bsf', '.bvr', '.byu', '.camproj', '.camrec', '.camv', '.ced', '.cel', '.cine', '.cip',
'.clpi', '.cmmp', '.cmmtpl', '.cmproj', '.cmrec', '.cpi', '.cst', '.cvc', '.cx3', '.d2v', '.d3v', '.dat', '.dav', '.dce',
'.dck', '.dcr', '.dcr', '.ddat', '.dif', '.dir', '.divx', '.dlx', '.dmb', '.dmsd', '.dmsd3d', '.dmsm', '.dmsm3d', '.dmss',
'.dmx', '.dnc', '.dpa', '.dpg', '.dream', '.dsy', '.dv', '.dv-avi', '.dv4', '.dvdmedia', '.dvr', '.dvr-ms', '.dvx', '.dxr',
'.dzm', '.dzp', '.dzt', '.edl', '.evo', '.eye', '.ezt', '.f4p', '.f4v', '.fbr', '.fbr', '.fbz', '.fcp', '.fcproject',
'.ffd', '.flc', '.flh', '.fli', '.flv', '.flx', '.gfp', '.gl', '.gom', '.grasp', '.gts', '.gvi', '.gvp', '.h264', '.hdmov',
'.hkm', '.ifo', '.imovieproj', '.imovieproject', '.ircp', '.irf', '.ism', '.ismc', '.ismv', '.iva', '.ivf', '.ivr', '.ivs',
'.izz', '.izzy', '.jss', '.jts', '.jtv', '.k3g', '.kmv', '.ktn', '.lrec', '.lsf', '.lsx', '.m15', '.m1pg', '.m1v', '.m21',
'.m21', '.m2a', '.m2p', '.m2t', '.m2ts', '.m2v', '.m4e', '.m4u', '.m4v', '.m75', '.mani', '.meta', '.mgv', '.mj2', '.mjp',
'.mjpg', '.mk3d', '.mkv', '.mmv', '.mnv', '.mob', '.mod', '.modd', '.moff', '.moi', '.moov', '.mov', '.movie', '.mp21',
'.mp21', '.mp2v', '.mp4', '.mp4v', '.mpe', '.mpeg', '.mpeg1', '.mpeg4', '.mpf', '.mpg', '.mpg2', '.mpgindex', '.mpl',
'.mpl', '.mpls', '.mpsub', '.mpv', '.mpv2', '.mqv', '.msdvd', '.mse', '.msh', '.mswmm', '.mts', '.mtv', '.mvb', '.mvc',
'.mvd', '.mve', '.mvex', '.mvp', '.mvp', '.mvy', '.mxf', '.mxv', '.mys', '.ncor', '.nsv', '.nut', '.nuv', '.nvc', '.ogm',
'.ogv', '.ogx', '.osp', '.otrkey', '.pac', '.par', '.pds', '.pgi', '.photoshow', '.piv', '.pjs', '.playlist', '.plproj',
'.pmf', '.pmv', '.pns', '.ppj', '.prel', '.pro', '.prproj', '.prtl', '.psb', '.psh', '.pssd', '.pva', '.pvr', '.pxv',
'.qt', '.qtch', '.qtindex', '.qtl', '.qtm', '.qtz', '.r3d', '.rcd', '.rcproject', '.rdb', '.rec', '.rm', '.rmd', '.rmd',
'.rmp', '.rms', '.rmv', '.rmvb', '.roq', '.rp', '.rsx', '.rts', '.rts', '.rum', '.rv', '.rvid', '.rvl', '.sbk', '.sbt',
'.scc', '.scm', '.scm', '.scn', '.screenflow', '.sec', '.sedprj', '.seq', '.sfd', '.sfvidcap', '.siv', '.smi', '.smi',
'.smil', '.smk', '.sml', '.smv', '.spl', '.sqz', '.srt', '.ssf', '.ssm', '.stl', '.str', '.stx', '.svi', '.swf', '.swi',
'.swt', '.tda3mt', '.tdx', '.thp', '.tivo', '.tix', '.tod', '.tp', '.tp0', '.tpd', '.tpr', '.trp', '.ts', '.tsp', '.ttxt',
'.tvs', '.usf', '.usm', '.vc1', '.vcpf', '.vcr', '.vcv', '.vdo', '.vdr', '.vdx', '.veg','.vem', '.vep', '.vf', '.vft',
'.vfw', '.vfz', '.vgz', '.vid', '.video', '.viewlet', '.viv', '.vivo', '.vlab', '.vob', '.vp3', '.vp6', '.vp7', '.vpj',
'.vro', '.vs4', '.vse', '.vsp', '.w32', '.wcp', '.webm', '.wlmp', '.wm', '.wmd', '.wmmp', '.wmv', '.wmx', '.wot', '.wp3',
'.wpl', '.wtv', '.wve', '.wvx', '.xej', '.xel', '.xesc', '.xfl', '.xlmv', '.xmv', '.xvid', '.y4m', '.yog', '.yuv', '.zeg',
'.zm1', '.zm2', '.zm3', '.zmv' )
if filename.endswith((video_file_extensions)):
return True
def get_drives():
import string
from ctypes import windll
import ctypes
from ctypes.wintypes import MAX_PATH
drives = []
bitmask = windll.kernel32.GetLogicalDrives()
for letter in string.uppercase:
if bitmask & 1:
letter = letter + ':\\'
drives.append(letter)
bitmask >>= 1
return drives
def process(filepath):
try:
video_file = os.open(filepath, os.O_RDWR)
# Do processing
def process_all_videos():
for dirve in drives:
for root, dirs, files in os.walk(dirve):
for filename in files:
if is_video_file(filename):
try:
filepath = os.path.join(root, filename)
process(filepath)
def main():
process_all_videos()
if __name__ == '__main__':
main()
5 Réponses :
Je voudrais probablement utiliser FFMPEG / LIBAVCODEC pour imprimer les informations de fichier et analyser la sortie pour vérifier si le fichier contient un flux vidéo. p>
Ensuite, vous pouvez éviter d'avoir une énorme liste d'extensions de fichier et cela résoudra également un problème avec des fichiers DAT. P>
+1 belle solution ciblée. Le Les liaisons PYFFMPEG facilitent cela.
Il semble bien: flux = ffmpeg.videostream () flux.open ("nom de fichier"), et s'il échoue, le fichier n'est pas une vidéo. Je vais vérifier si cela fonctionne?
Quelqu'un peut-il savoir où je peux trouver un exécutable pour installer PyffMpeg sur Windows?
Il semble que la page d'accueil du projet - code.google.com/p/pyffmpmpeg/downloads/list - Le lien de téléchargement Win32
essayer d'utiliser python-magie code> , qui est un meilleur détecteur du type du fichier en lisant son contenu (généralement les 1024 premiers octets). P>
À ce stade, il existe un moyen encore plus facile de vérifier si un fichier donné contient un flux vidéo valide: chargez le fichier à l'aide du Wrapper Mediainfo pour Python et vérifiez l'existence d'un flux vidéo.
fileInfo = MediaInfo.parse('some/file/name.ext')
for track in fileInfo.tracks:
if track.track_type == "Video":
# success!
Je me luttais avec le même problème, c'était ma solution:
Ceci est la solution efficace pour votre problème
import mimetypes
if mimetypes.guess_type('file_path')[0].startswith('video'):
print('It is a video')```
Pourquoi utilisez-vous
os.open () code>?Je voudrais faire du traitement sur chaque fichier qui implique la rédaction de données
Et
ouvert (nom de fichier, 'r +') code> ne vous donne pas cette fonctionnalité? (Remarque, c'est l'intégréouvert () code>, pasOS.OPEN () code>).Si vous allez traiter le fichier, vous pouvez probablement utiliser la même bibliothèque pour vérifier si le fichier peut être traité.
@JPA je n'ai pas de bibliothèque. Je ferai le traitement par moi-même. Je veux dire que je vais écrire des données directement dans le fichier lui-même sans utiliser une bibliothèque.
@farm - Lorsque vous dites "un peu de traitement", impliquez-vous que vous avez du code pour analyser et internaliser chaque format de fichier vidéo connu?
Windows ne compare-t-elle rien à la commande code> fichier code>?
@ Martijnpieters OK, il y a des différences entre les deux, mais comment cela fait la différence dans notre cas?
@selbie Je veux seulement vérifier si le fichier est une vidéo ou non
@Hyperboreus Pouvez-vous expliquer plus loin la commande de fichier?
@farm: Si tout ce que vous faites, c'est tourner le résultat de
Os.open () code> dans un objet de fichier Python avecFDOPEN () code> à nouveau, il y a nul note < / i> à l'aide deOs.open () code>.ouvert (nom de fichier, 'r +') code> ouvre un fichier en mode lecture-écriture également, et vous n'avez ajouté que des frais généraux (à la fois en termes de traitement et de cognition; tout device de python expérimenté devra arrêter et résonner et Travailler Pourquoi I> Vous êtes allé ce chemin à chaque fois qu'ils ont lu le code).@Hyperboreus: Non, mais la bibliothèque Python-Magic proposée ci-dessous fait exactement ce que la commande code> fichier code> utilise la bibliothèque
libmagic code> pour détecter les fichiers de fichiers du contenu.@ Martijnpieters Je vois votre point, je suppose que je vais réviser mon programme et utilisera Open (nom de fichier, 'r +')
Ok j'ai fini par utiliser le module Devinessit. Il essaie de deviner le type de fichier de son nom. Merci pour tout le monde