2012-12-25 60 views
2

我這裏有這個Python腳本運行時打開目錄中的一個隨機視頻文件:如何允許打開文件名中含有Unicode字符的文件?

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字符的文件?

回答

3

只要使用Unicode文字,例如u".mp4"無處不在。在Python IO函數將返回如果你給他們的Unicode輸入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內部使用後者。

-1

請務必仔細閱讀到您的源代碼添加# -*- coding: utf-8 -*-

你的unicode所以Python的理解。

+4

-1:源代碼字符編碼與用於文件名的字符編碼無關。無論如何,OP代碼中都有* no *非ascii字符。編碼聲明在這裏是不必要的。 – jfs

0

可以使用J.F.Sebastian描述的Unicode文字,也可以使用總是使用Unicode的Python 3。 (對於Python 3,腳本需要稍作修改:print現在是一個函數,所以你必須在參數列表中加上圓括號。)

2

運行BAT文件時的錯誤是因爲BAT文件本身保存爲「帶有BOM的UTF-8」。 「∩╗┐」字節不是損壞的文件名,它們是存儲在BAT文件中的字面首字節。將BAT文件重新保存爲ANSI或UTF-16,這是BAT文件唯一支持的編碼。

+0

你是對的。 BAT文件編碼是問題的一部分。保存爲「帶有BOM的UTF-8」的確會導致我提到的命令行錯誤消息。將該解決方案與@JF結合使用。塞巴斯蒂安的[答](http://stackoverflow.com/a/14031835/1626811),我現在可以用Python腳本打開文件名中包含Unicode字符的文件。 – galacticninja

相關問題