6
import os
xp1 = "\Documents and Settings\"
xp2 = os.getenv("USERNAME")
print xp1+xp2

エラーが発生する

 File "1.py", line 2 
xp1 = "\Documents and Settings\"
                               ^
SyntaxError: EOL while scannning single-quoted string

問題がわかりましたか?

4

7 に答える 7

21

バックスラッシュ文字はエスケープとして解釈されます。Windows パスには 2 つのバックスラッシュを使用します。

>>> xp1 = "\\Documents and Settings\\"
>>> xp1
'\\Documents and Settings\\'
>>> print xp1
\Documents and Settings\
>>> 
于 2009-02-01T17:25:09.003 に答える
11

ブラックスラッシュの問題に加えて、「+」演算子でパスを結合しないでくださいos.path.join。代わりに使用してください。

また、新しいバージョンの Windows で失敗する可能性が高いような、ユーザーのホーム ディレクトリへのパスを作成します。pywin32 にはそのための API 関数があります。

于 2009-02-01T17:26:31.420 に答える
8

このos.path.expanduser関数を使用して、ユーザーのホーム ディレクトリへのパスを取得できます。既存のユーザーである必要さえありません。

>>> import os.path
>>> os.path.expanduser('~foo')
'C:\\Documents and Settings\\foo'
>>> print os.path.expanduser('~foo')
C:\Documents and Settings\foo
>>> print os.path.expanduser('~')
C:\Documents and Settings\MizardX

" " は、ユーザーのホーム ディレクトリ~userへのパスに展開されます。単一の " " だけが現在のユーザーのホーム ディレクトリに展開されます。~

于 2009-02-01T17:39:28.693 に答える
6

Python は、他の多くの言語と同様に、バックスラッシュをエスケープ文字として使用します (したがって、 xp1=... 行の最後の二重引用符は、文字列の区切り文字としてではなく、文字列の一部と見なされます)。

これは実際にはかなり基本的なことなので、先に進む前にPython チュートリアルを読むことを強くお勧めします。

バックスラッシュをエスケープしない文字列に興味があるかもしれません。文字列の直前にrを追加するだけです:

xp1 = r"\Documents and Settings\"

さらに、ファイル パスを操作する場合は、os.pathモジュールを使用する必要があります。これは、プログラムが実行されている OS に応じて「/」または「\」を使用します。例えば:

import os.path
xp1 = os.path.join("data","cities","geo.txt")

Linux では "data/cities/geo.txt"、Windows では "data\cities\geo.txt" が生成されます。

于 2009-02-01T17:53:46.700 に答える
5

\"「文字列に二重引用符を挿入すると解釈されるため、文字列リテラルの終了引用符がありません。生の文字列r"\"も役に立たないことに注意してください。

ドキュメントからの引用(太字は私のものです):

'r' または 'R' プレフィックスが存在する場合、バックスラッシュに続く文字はそのまま文字列に含まれ、すべてのバックスラッシュは文字列に残されます。たとえば、文字列リテラル r"\n" は、バックスラッシュと小文字の 'n' の 2 つの文字で構成されます。文字列の引用符はバックスラッシュでエスケープできますが、バックスラッシュは文字列に残ります。たとえば、r"\"" はバックスラッシュと二重引用符の 2 文字で構成される有効な文字列リテラルですが、r"\" は有効な文字列リテラルではありません (生の文字列であっても奇数のバックスラッシュで終わることはできません)。)。具体的には、生の文字列を単一のバックスラッシュで終了することはできません (バックスラッシュは次の引用文字をエスケープするため)。また、単一のバックスラッシュとそれに続く改行は、行の継続としてではなく、文字列の一部としてこれら 2 つの文字として解釈されることに注意してください。

@MizardXの答えは、あなたがしていることをコーディングする正しい方法です。

于 2011-12-09T07:09:22.200 に答える