2017-06-26 5 views
0

sys.argv[1] + "string"で参照されるいくつかのファイルを開くことを目的とする以下のプログラムを検討してください。実行(Pythonの3.6はWindows 7)でWindows上のPythonでsys.argv経由で提供されたパスで指定されたファイルを開きますか?

import sys 

def searchAndReplacePath(path): 

    filesToSearch = [path + "\main\file1.txt", 
        path + "\main\folder\file2.txt"] 

    for files in filesToSearch: 
     with open(files, 'r') as inFile: 
      filedata = inFile.readlines() 

if __name__ == "__main__": 
    # sys.argv[1] -- Specify which path should be used 
    searchAndReplacePath(sys.argv[1]) 

私はエラーが表示されます。

Traceback (most recent call last): 
    File "searchAndReplacePath.py", line 35, in <module> 
    searchAndReplacePath(sys.argv[1]) 
    File "searchAndReplacePath.py", line 19, in searchAndReplacePath 
    with open(file, 'r') as inFile: 
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\user\\main\\file1.txt' 

Pythonは私のバックスラッシュにバックスラッシュを追加します!リストを反復して、リスト内の各項目をprint()とすると、「単一のバックスラッシュ」が得られるので、何をすべきかはわかりません。私はraw stringsと使用方法について多くを読んでいます:r"path\to\file"しかし、私はsys.argv []から私の入力を取るので、私は実際にどのように同じ結果を達成するために今はありません。

WindowsのPythonでsys.argv[]で指定されたパスで指定されたファイルを開くにはどうすればよいですか?

+2

"\"は多くのプログラミング言語で特殊文字です。例えば。 '\ n'は"改行 "を、\ tは"タブ "を生成します。したがって、 "\\"を含む文字列は "\"を出力します。指定された場所に2つのファイルが存在しますか? –

+0

これを見て、それはあなたを助けることができます:https://learnpythonthehardway.org/book/ex10.html 二重バックスラッシュはPythonの特別な文字であり、単に文字列として置くことはできません。 – Artur

+0

私は完全に認識しています、ありがとうございます。現在の問題は、Pythonが '\'とsys.argを私の期待通りに扱わないことに関連しています。 – GLaDER

答えて

1

Pythonのosモジュールを使用してみてください: import os files_to_search = [os.path.join(path, 'main\file1.txt') ... ]

+0

これは動作しません。前述のエラーの代わりに、私はこういうファイルやディレクトリはありません: 'C:\\ main \\ file1.txt''。すなわち、 'C:'のみが 'path'変数から保持されます。 – GLaDER

+0

をデバッグするために、あなたのファイルを含むディレクトリの中で '' >>> print(os.getcwd()) 'を呼び出すとどうなるでしょうか? –

+0

現在のディレクトリを取得します。二重バックスラッシュは使用しません。 – GLaDER

1

問題ここでは、次の対話セッションで見られ:

>>> "\f" 
'\x0c' 
>>> '\\f' 
'\\f' 
>>> r'\\f' 
'\\\\f' 
>>> '\f' 
'\x0c' 
>>> r'\f' 
'\\f' 
>>> 

インタプリタは、文字列のreprを印刷したときに、見ることができるように、それは、バックスラッシュを引用してPythonソースを反映します。 '\f'は2文字ではなく1文字です。ファイル名を印刷するとき、その通訳者はrepr()を使用しています。

また、この違いに注意してください。

>>> print('\"') 
" 
>>> '\"' 
'"' 

あなたはrepr()が、それはPythonプログラムで表現されるようなことを示す、値の前後に引用符を追加していることがわかります。

関連する問題