-2

ある場所 (現在は C:\dropbox にあります) にファイル "Reference.txt" があります。この場所からファイルを開いてその内容を取得しようとしています。"Reference.txt" の内容は "E4567ABCDE16220 .1"、次を使用してこのデータを取得する必要があります。これを行う方法について誰かが入力できますか?

file="Reference.txt" 
pL="ab1234"

def location(file,pL):
    if pL is 'ab1234':
        file = open('C:\dropbox\' + file,'r')
        print file
    else:
        file = open('C:\dropbox\' + pL + file,'r')

def main ():
    data=location(file,pL)

if __name__ == '__main__':
    main()
4

4 に答える 4

3

問題は、 でファイルを開く方法に起因しますC:\Dropbox\。を使用する\と、次の文字をその文字通りの意味からエスケープするエスケープ文字として機能します。したがって、二重引用符を含む文字列を二重引用符を使用して作成したい場合は、文字列内のすべての二重引用符をエスケープする必要があります。
例えば:

変数 string 内に保持するとしますAlice told Bob "Mallory knows what we're up to"
それを文字列に入れると、次のようになります。

myStr = "Alice told Bob "Mallory knows what we're up to""

次に、Python は"Alice told Bob "1 つの文字列であると見なし、そこで何をしているのかわかりませんMallory knows what we're up to。したがって、通訳者は文句を言うでしょう。

二重引用符が文字列自体の一部であるという概念を捉えるために、次のようにエスケープする必要があります。

myStr = "Alice told Bob \"Mallory knows what we're up to\""

\しかし、文字列の一部としてa が必要な場合はどうなるでしょうか? 次に、別のもので
エスケープする必要があります:\\

myStr = "this is a backslash: \\"

したがって、 を開こうとすると"C:\Dropbox\somefile"、python は 2 つのエスケープ シーケンスがあると解釈します:\D\sは、その文字列内のこれらのエスケープ シーケンスの値を置換し、ファイル システムに存在しない結果のファイル名を開こうとします。これを適切にエスケープするには、次のようにする必要があります。

myfile = open("C:\\Dropbox\\somefile.txt")

ただし、これは読みにくい場合があります。したがって、生の文字列 (接頭辞がr) を使用することをお勧めします。生の文字列は、文字列内のエスケープ シーケンスを置き換えません。

myfile = open(r"C:\Dropbox\somefile.txt")

したがってr"C:\Dropbox\somefile.txt""C:\\Dropbox\\somefile.txt"

あなたがしていることについてのもう1つのコメント:os.path.joinファイルパスの一部を一緒に結合するときに本当に使用する必要があります。あなたがするだろう一方

 myfile = open('C:\\dropbox\\' + pL + file,'r')

あなたは本当にするべきです

 myfile = open(os.path.join("C:\\dropbox", pL, filename),'r')

最後の注意:
変数filestrその他listの組み込み型に名前を付けないでください。これにより、インタープリターの動作が混乱し、後で望ましくない結果が生成されます。

于 2012-12-24T10:11:31.380 に答える
2

等しいかどうかのテストには使用しないでください。is代わりに使用==します。まったく異なる魚のやかんであるオブジェクトの同一性isをテストします。

os.path.join()関数を使用してパスを作成します。また、バックスラッシュr''を含むパスには生の文字列を使用し\\バックスラッシュを2 つにする\\か、代わりにスラッシュを使用します ( /) 。Python 文字列では、「ここに文字列に\'リテラル文字を挿入する」ことを意味します。代わりに文字列。'

import os.path

def location(filename, pL):
    if pL == 'ab1234':
        filename = os.path.join(r'C:\dropbox', filename)
    else:
        filename = os.path.join(r'C:\dropbox', pL, filename)
    with open(filename, 'r') as f:
        return f.read()

open()ファイルを開くだけです。データを取得するには、開いているファイルでも呼び出す必要があり.read()ます。fileはすでに組み込みの名前であるため、それを変数として使用しないことをお勧めします。そのため、上記のコードで名前を変更しました。最後になりましたが、withコンストラクトを使用することで、データを読み取って関数から返すと、ファイル オブジェクトが自動的に閉じられます。

于 2012-12-24T09:59:45.747 に答える
0

以下は問題を修正しました

import os.path

def location(filename, pL):
    if pL == 'ab1234':
        filename = os.path.join(r'C:\dropbox', filename)
    else:
        filename = os.path.join(r'C:\dropbox', pL, filename)
    with open(filename, 'r') as f:
        return f.read()
于 2012-12-24T19:14:09.270 に答える
0

次のように実行できるファイルの内容を読み取る必要があります。

file="Reference.txt" 
pL="ab1234"

def location(file,pL):
    if pL == 'ab1234':
        file = open('C:\dropbox\' + file,'r')
    else:
        file = open('C:\dropbox\' + pL + file,'r')

    return file.readlines()

def main ():
    data=location(file,pL)
    print data

if __name__ == '__main__':
    main()

ファイルの内容を読み取るには、必要に応じてオブジェクトで 、 、を使用できます。Google がお手伝いread()readline()ますreadlines()file

于 2012-12-24T10:45:21.760 に答える