[英]How do I allow opening of files that have Unicode characters in their filenames?
我这里有这个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)
来源:我的超级用户帖子中的回答:“ 如何打开文件夹中的随机文件,并设置仅打开具有指定文件扩展名的文件? “
这由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)更改为命令行日志中的“∩╗┐”。
编辑:我了解到上述命令行错误消息是由于将BAT文件另存为'带有BOM的UTF-8'所致。 将其另存为“ 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字符的文件?
只需在各处使用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,))
如果要模拟Web浏览器如何打开视频文件,则可以使用webbrowser.open()
而不是os.startfile()
尽管前者可能会在Windows上内部使用后者。
运行BAT文件时出错是因为BAT文件本身另存为“带BOM的UTF-8”。 “∩╗┐”字节不是损坏的文件名,它们是存储在BAT文件中的字面第一个字节。 将BAT文件重新保存为ANSI或UTF-16,这是BAT文件唯一支持的编码。
按照JF Sebastian的描述使用Unicode文字,或者使用始终使用Unicode的Python 3。
(对于Python 3,您的脚本将需要稍作修改:print现在是一个函数,因此您必须在参数列表周围加上括号。)
请熟悉一下在源代码中添加# -*- coding: utf-8 -*-
,
因此python了解您的unicode。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.