2016-03-28 8 views
0

が私のコードではPython 2.xでファイルを正しくできない理由を私は理解していない: オープン()ここで

copy from: asd.txt 
File doesn't exist. 
File name: test.txt 
copy to: dsa.txt 
File doesn't exist. 
File name: test.py 
Traceback (most recent call last): 
    File "ex17.py", line 17, in <module> 
    f.write(open(from_file).read()) 
IOError: [Errno 2] No such file or directory: 'ad.txt' 

ターミナル

from os.path import exists 

def confirm(file_name): 
    while not exists(file_name): 
     print "File doesn't exist." 
     file_name = raw_input("File name: ") 

from_file = raw_input("copy from: ") 
confirm(from_file) 
to_file = raw_input("copy to: ") 
confirm(to_file) 

with open(to_file, 'w')as f: 
    f.write(open(from_file).read()) 

出力は、なぜそれが間違っを開くんファイル?

修正方法?

そして、私はこれを行うとき:

from_file = raw_input("copy from: ") 
    while not exists(from_file): 
     print "File doesn't exist." 
     from_file = raw_input("File name: ") 

は、それはうまく動作します。

コードを少なくするために関数を定義したいのですが、問題が発生します。

+0

私を参照してください。あなたのアプローチのわずかなバリエーションの下で以下の答えをお試しください... –

+0

このコードであなたの目的は何ですか?カントが存在するため、11行(confirm(to_file))を削除することができます。 – Milor123

+0

@ Milor123あなたの助けてくれてありがとう、私はそれを以前に知りませんでした。 –

答えて

3

、あなたはループwhileは入力が既存のファイルではありませんし、それ既存のファイルの場合、ファイルのパスを返します。このような何かを行うことができます。

from os.path import exists 

def getFileName(msg): 
    file_name = raw_input(msg) 
    while not exists(file_name): 
     print "File {} doesn't exist. Try again!".format(file_name) 
     file_name = raw_input(msg) 
    return file_name 

from_file = getFileName("copy from: ") 
to_file = getFileName("copy to: ") 

with open(to_file, 'w') as f: 
    f.write(open(from_file).read()) 

NOTEこれは、両方のファイルが既に存在を前提としています。実行時にto_fileを作成する予定がある場合は、修正する必要があります。その場合は、私に教えてください...

+0

'confirm'の呼び出しは返されるものを何もしないので、問題ではありません。 –

+0

@ScottHunter改訂された回答を参照してください... –

+0

Get ** NOTE **。この方法でコードを書いたのは、実行時にファイルを作成できるかどうかわからないからです。あなたの答えは私にたくさんのインスピレーションを与えます。 –

2

confirm内にあるfile_nameの変更は、その関数に渡されたパラメータには影響しません。 の最終的な値をconfirmに戻し、呼び出し元にその値を適切な変数に割り当てさせる必要があります。私は内部的にraw_inputを処理するための機能を変更します

+0

実際に私は戻り値で試しました。 'file_name = raw_input(" File name: ")'の後ろに 'return file_name'を垂直に置いてもまだ動作しませんでした。 'While'と一緒に垂直に置くこともできますが、動作しませんでした。 –

+1

@WillBeethoven: 'return file_name'を' while'ループの外側に入れましたか? 'confirm'関数呼び出しから返されたファイル名を割り当てましたか? –

+0

@ PM 2Ringありがとうございました!これからは、リターンの使い方を理解しています。 –

1

削除ライン11((to_file)を確認)、新しいファイルカントは、私はあなたがこれを使用することができると考えて

が存在する:

with open('file.txt', 'r') as f: 
    with open('newfile.txt', 'w') as nf: 
     nf.write(f.read()) 
関連する問題