15

いくつかの背景情報:私が働いている古代のWebベースのドキュメントデータベースシステムは、ほぼ完全に「通常の」拡張子(.doc、.xls、.ppt)を持つMSOfficeドキュメントで構成されています。それらはすべて、ある種の任意のID番号(つまり1245.doc)に基づいて名前が付けられています。SharePointに切り替えているので、これらすべてのファイルの名前を変更して、フォルダーに並べ替える必要があります。あらゆる種類の情報(どのID番号がどのドキュメントのタイトルに対応するかなど)を含むCSVファイルがあるので、これらのファイルの名前を変更するために使用しています。ID番号のタイトルの名前を変更する短いPythonスクリプトを作成しました。

ただし、ドキュメントのタイトルの中には、ファイルのタイトルに含まれるスラッシュやその他の不適切な文字が含まれているものがあるため、それらをアンダースコアに置き換えたいと思います。

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
    filename = line[2].replace(letter, "_")
    foldername = line[5].replace(letter, "_")
  • line[2]:「Blahblahboring-meeting 2/19/2008.doc」
  • line[5]:「ビジネスミーティング2/2008」

print letterループ内に追加するforと、置き換えられるはずの文字が出力されますが、実際には、その文字が必要なアンダースコアに置き換えられることはありません。

ここで私が間違っていることはありますか?

4

5 に答える 5

30

これは、ループが繰り返されるたびに破棄されるfilenameためです。foldernameこの.replace()メソッドは文字列を返しますが、結果はどこにも保存されていません。

次を使用する必要があります。

filename = line[2]
foldername = line[5]

for letter in bad_characters:
    filename = filename.replace(letter, "_")
    foldername = foldername.replace(letter, "_")

しかし、私は正規表現を使用してそれを行います。よりクリーンで(おそらく)より高速です:

p = re.compile('[/:()<>|?*]|(\\\)')
filename = p.sub('_', line[2])
folder = p.sub('_', line[5])
于 2010-08-19T15:01:33.683 に答える
6

ループの反復ごとにfilenameと変数に再割り当てします。foldername事実上、*交換されているだけです。

于 2010-08-19T15:01:22.000 に答える
4

Python文字列メソッドtranslate() http://docs.python.org/library/string.html#string.translatehttp://docs.python.org/library/string.html#string.maketransを確認する必要があります

これを編集して、以下のコメント提案に従って例を追加します。
import string
toreplace=''.join(["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]) 
underscore=''.join( ['_'] * len(toreplace))
transtable = string.maketrans(toreplace,underscore)
filename = filename.translate(transtable)
foldername = foldername.translate(transtable)

toreplaceを'/\ :,'などにすることで簡略化できますが、上記の内容を使用しました

于 2010-08-19T15:04:15.107 に答える
3

置き換えられた結果を保存するのではなく、ベースラインからやり直しているため、次のようになります。

filename = line[2].replace('*', '_')
foldername = line[5].replace('*', '_')

次を試してください

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
filename = line[2]
foldername = line[5]
for letter in bad_characters:
    filename = filename.replace(letter, "_")
    foldername = foldername.replace(letter, "_")
于 2010-08-19T15:05:35.877 に答える
1

string.replace(str、fromStr、toStr)を使用する必要があります

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
    filename = string.replace(line[2], letter, "_")
    foldername = string.replace(line[5], letter, "_")
于 2011-08-18T16:20:32.273 に答える