web-dev-qa-db-ja.com

Python string.replace()は文字を置き換えません

いくつかの背景情報:私が働いている古代の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」

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

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

13
ZeroUptime

これは、ループが繰り返されるたびにfilenamefoldernameが破棄されるためです。 .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])
26

ループが繰り返されるたびに、filename変数とfoldername変数に再割り当てします。実際には、*のみが置き換えられています。

6
Vebjorn Ljosa

python string method translate()http://docs.python.org/library/string.html#string.translate を確認する必要がありますと http://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を '/ \:、'などのようにすることで単純化できます、私は上記のものを使用しました

4
Amala

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

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, "_")
3
Kathy Van Stone

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

bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
    filename = string.replace(line[2], letter, "_")
    foldername = string.replace(line[5], letter, "_")
1
wu liang