2017-07-30 100 views
1

ファイルパスの最後のディレクトリの後にテキストファイルの名前を付けようとしています。私は、フォワードまたはバックスラッシュのどちらかを使用するOSのためにこの名前を得る必要があります。スラッシュファイルのパスには文字列split()メソッドを使用しましたが、バックスラッシュは使用しませんでした。また、バックスラッシュのディレクトリ名を表示しようとするとスラッシュは含まれません(おそらくエスケープシーケンスとして読み込まれます)。しかし、私がre.search()メソッドを使用すると、それでもスラッシュが見つかります。バックスラッシュにpython string split()を使用するには?

これを修正するにはどうすればよいですか?

を参照してください以下のコード:

import re 
import sys 

targetDirectory = sys.argv[1] 
filePathDirectorySeparator = '' 
usesForwardSlashSeparator = re.search('/', targetDirectory) 
if(usesForwardSlashSeparator): 
    filePathDirectorySeparator = '/' 
else: 
    filePathDirectorySeparator = '\\' 

fileName = targetDirectory.split(filePathDirectorySeparator)[-1] 
file = open(fileName, 'w+') 
file.write('HELLO') 
file.close() 

リンクは私のコンソール出力(Iは、まだ明らかに画像を埋め込むことが許されていないよ...)

+0

私はimgurにアップロードしたのでリンクが表示されません:http://imgur.com/a/ijLgK –

+0

あなたのシェルがバックスラッシュを解釈していると思いますので、 sys.argv'をPythonで使用します。コマンドラインでエスケープできますか? – Blckknght

+0

[os.path](https://docs.python.org/3/library/os.path.html)を見てください。また、Windowsのパスにスラッシュを使用することもできます。 –

答えて

1

私はあなたが必要以上に難しくしようとしていると思います。PythonはFUを持ってosモジュールを持っていますプラットフォームとは無関係に、あなたが望むものを正確に行うことができます。ここでは、あなただけは、Pythonを使用している場合にも、あなたが真剣に、よりPython的ヘビケース(file_name)に離れたキャメルケース(fileName)から移動することを検討すべきである

fileName=os.path.basename(targetDirectory) 

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

+0

とキャメルケースに注目するための1つ! –

+0

ありがとうございます! –

2

小さな例、

>>> print s 
this/hello\ 
>>> import re 
>>> re.split('/',s) 
['this', 'hello\\'] 
>>> re.split('\\',s) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 171, in split 
    return _compile(pattern, flags).split(string, maxsplit) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 251, in _compile 
    raise error, v # invalid expression 
sre_constants.error: bogus escape (end of line) 
>>> re.split(r'\\',s) 
['this/hello', ''] 
を示し

「r」接頭辞は重要です!

Reference!ある

「R」または「R」接頭辞が存在する

は、 バックスラッシュの後の文字はそのまま文字列に含まれ、そして全て バックスラッシュは、文字列中に残されています。たとえば、文字リテラル r "\ n"は、バックスラッシュと小文字の "n"の2つの文字で構成されています。 文字列引用符はバックスラッシュでエスケープできますが、バックスラッシュ は文字列に残ります。 r "\"は有効な文字列リテラルです は2つの文字で構成されています:円記号と二重引用符; r "\"は です。有効な文字列リテラルではありません(生の文字列でも奇数で終わることはできません) 特に、生の文字列は、 単一のバックスラッシュで終わることはできません(バックスラッシュは、次の引用符 文字をエスケープするため)。また、改行が続く単一のバックスラッシュは、文字列の一部としてこれら2つの文字として解釈されます、ないよう 行継続。

+0

少し引用を引用してください。そのリンクが変更された場合、その説明は役に立たなくなるので、投稿するリンクから関連するスニペットを必ず含めてください。 – Soviut

+0

ええ。ありがとう! –

+0

ありがとうございました! –

関連する問題