2

実行時にディレクトリ内のランダムなビデオファイルを開く次の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ファイルを「UTF-8withBOM」として保存したことが原因であることがわかりました。'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」に変更されます。コマンドラインログ。

私はWindows7、64ビットでPython2.7を使用しています。

ファイル名にUnicode文字が含まれているファイルを開くことを許可するにはどうすればよいですか?

4

4 に答える 4

3

u".mp4"たとえば、どこでもUnicodeリテラルを使用するだけです。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ブラウザがビデオファイルを開く方法をエミュレートする場合は、前者がWindowsの内部で後者を使用する可能性がありますが、webbrowser.open()代わりに使用できます。os.startfile()

于 2012-12-25T15:17:17.960 に答える
2

BATファイル実行時のエラーは、BATファイル自体が「UTF-8withBOM」として保存されているためです。「∩╗┐」バイトは破損したファイル名ではなく、BATファイルに格納されているリテラルの最初のバイトです。BATファイルをANSIまたはUTF-16として再保存します。これらは、BATファイルでサポートされている唯一のエンコーディングです。

于 2012-12-25T19:46:21.043 に答える
0

JF Sebastianによって説明されているようにUnicodeリテラルを使用するか、常にUnicodeを使用するPython3を使用します。

(Python 3の場合、スクリプトに小さな変更を加える必要があります。printは関数になっているため、パラメーターリストを括弧で囲む必要があります。)

于 2012-12-25T18:29:26.340 に答える
-1

# -*- coding: utf-8 -*-ソースコードを追加するためによく理解してください。

だからあなたのユニコードについてのPythonの理解。

于 2012-12-25T15:36:51.097 に答える