我这里有这个Python脚本,在运行时在目录中打开一个随机视频文件:
import glob,random,os
files = glob.glob("*.mkv")
files.extend(glob.glob("*.mp4"))
files.extend(glob.glob("*.tp"))
files.extend(glob.glob("*.avi"))
files.extend(glob.glob("*.ts"))
files.extend(glob.glob("*.flv"))
files.extend(glob.glob("*.mov"))
file = random.choice(files)
print "Opening file %s..." % file
cmd = "rundll32 url.dll,FileProtocolHandler \"" + file + "\""
os.system(cmd)
来源:我的超级用户帖子中的回答“How do I open a random file in a folder, and set that only files with the specified filename extension(s) should be opened?”
这是由BAT文件调用的,其作为脚本:
C:\Python27\python.exe "C:\Programs\Scripts\open-random-video.py" cd
我把这个BAT文件放在我要打开随机视频的目录中。
在大多数情况下,它工作正常。但是,我无法在文件名中打开带有Unicode字符的文件(例如我的日文或韩文字符)。
这是在目录上运行BAT文件和Python脚本并在其文件名中打开包含Unicode字符的文件时的错误消息:
C:\TestDir>openrandomvideo.BAT
C:\TestDir>C:\Python27\python.exe "C:\Programs\Scripts\open-random-video.py" cd
The filename, directory name, or volume label syntax is incorrect.
请注意,该日志中.FLV视频文件的文件名在原始文件名(소시.flv)中更改为命令行日志中的“∩╗┐”。
编辑:我了解到上述命令行错误消息是由saving the BAT file as 'UTF-8 with BOM'引起的。将其另存为“ANSI或UTF-16”会显示以下消息,但仍然无法打开文件:
C:\TestDir>openrandomvideo.BAT
C:\TestDir>C:\Python27\python.exe "C:\Programs\Scripts\open-random-video.py" cd
Opening file ??.flv...
现在,该日志中.FLV视频文件的文件名已从其原始文件名(소시.flv)更改为“??。flv”。在命令行日志中。
我在Windows 7,64位上使用Python 2.7。
如何允许打开文件名中包含Unicode字符的文件?
答案 0 :(得分:3)
只需使用Unicode文字,例如u".mp4"
。如果你给它们输入Unicode输入,Python中的IO函数将返回Unicode文件名(在内部它们可能使用支持Unicode的Windows API):
import os
import random
videodir = u"." # get videos from current directory
extensions = tuple(u".mkv .mp4 .tp .avi .ts .flv .mov".split())
files = [file for file in os.listdir(videodir) if file.endswith(extensions)]
if files: # at least one video file exists
random_file = random.choice(files)
os.startfile(os.path.join(videodir, random_file)) # start the video
else:
print('No %s files found in "%s"' % ("|".join(extensions), videodir,))
如果您想模拟您的网络浏览器打开视频文件的方式,那么您可以使用webbrowser.open()
而不是os.startfile()
,但前者可能会在Windows内部使用后者。
答案 1 :(得分:2)
运行BAT文件时的错误是因为BAT文件本身保存为“带BOM的UTF-8”。 “∩╗┐”字节不是损坏的文件名,它们是存储在BAT文件中的文字第一个字节。将BAT文件重新保存为ANSI或UTF-16,这是BAT文件唯一支持的编码。
答案 2 :(得分:0)
使用J. F. Sebastian描述的Unicode文字,或者使用Python 3,它总是使用Unicode。
(对于Python 3,您的脚本需要稍作修改:print现在是一个函数,因此您必须在参数列表周围添加括号。)
答案 3 :(得分:-1)
请熟悉在源代码中添加# -*- coding: utf-8 -*-
让python了解你的unicode。