如何允许打开文件名中包含Unicode字符的文件?

时间:2012-12-25 15:10:01

标签: python windows-7 unicode batch-file python-unicode

我这里有这个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字符的文件?

4 个答案:

答案 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。