38

Python で不適切なパス文字 (Windows の "\" または ":" など) を削除する最もクロス プラットフォームな方法は何ですか?

解決

理想的な解決策がないように思われるため、比較的制限を厳しくすることにし、次のコードを使用しました。

def remove(value, deletechars):
    for c in deletechars:
        value = value.replace(c,'')
    return value;

print remove(filename, '\/:*?"<>|')
4

4 に答える 4

35

ここで最も安全な方法は、疑わしい文字を置き換えることだと思います。したがって、英数字、-、_、スペース、またはピリオド以外のものを置き換える (または削除する) ことができると思います。そして、これを行う方法は次のとおりです。

import re
re.sub(r'[^\w\-_\. ]', '_', filename)

'_'上記は、文字、、、またはスペース'-'以外のすべての文字を . でエスケープします。したがって、パス全体を見ている場合は、os.sep も承認済み文字のリストに追加する必要があります。'.''_'

出力例を次に示します。

In [27]: re.sub(r'[^\w\-_\. ]', '_', r'some\*-file._n\\ame')
Out[27]: 'some__-file._n__ame'
于 2012-11-27T22:01:10.387 に答える
23

残念ながら、受け入れ可能な文字のセットは、OSおよびファイルシステムによって異なります。

  • Windows

    • 以下を除いて、名前には現在のコードページのほぼすべての文字を使用します。これには、Unicode文字と拡張文字セット(128〜255)の文字が含まれます。
      • 次の予約文字は使用できません:
        <>: "/ \ |?*
      • 整数表現が0から31の範囲にある文字は許可されません。
      • ターゲットファイルシステムで許可されていないその他の文字。

    受け入れられる文字のリストは、ファイルシステムを最初にフォーマットしたマシンのOSとロケールによって異なります。

    .NETにはGetInvalidFileNameCharsGetInvalidPathCharsがありますが、Pythonからそれらを呼び出す方法がわかりません。

  • Mac OS:NULは常に除外され、「/」はPOSIXレイヤーから除外され、「:」はAppleAPIから除外されます
    • HFS +:Unicode2.0仕様でUTF-16で表現できる除外されていない文字のシーケンス
    • HFS:ファイルシステムを作成したマシンに応じて、MacRoman(デフォルト)またはその他のエンコーディングで表現可能な除外されていない文字のシーケンス
    • UFS:HFS+と同じ
  • Linux:
    • ネイティブ(UNIXライクな)ファイルシステム:NULと「/」を除く任意のバイトシーケンス
    • FAT、NTFS、その他の非ネイティブファイルシステム:さまざま

最善の策は、すべてのプラットフォームで過度に保守的であるか、ファイル名を作成してエラーを処理することです。

于 2009-06-23T16:21:28.343 に答える
-1

その文字は にos.sepあり、使用しているシステムに応じて「\」または「:」になります。

于 2009-06-23T15:48:32.703 に答える
-1

Python を使用している場合は、os.pathを試して、パスに関するクロス プラットフォームの問題を回避してください。

于 2009-06-23T16:08:22.363 に答える