2016-03-28 4 views
0

Hier ist mein Code:Ich verstehe nicht, warum kann nicht geöffnet werden (Datei) korrekt in Python 2.x

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()) 

Ausgabe im Terminal

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' 

Warum nicht, öffnen Sie die falsche Datei?

Wie es zu beheben?

Und wenn ich dies tun:

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

es funktioniert gut.

Ich möchte eine Funktion für weniger Code definieren, aber ich bekomme ein Problem.

+0

Meine Beantworten Sie unten eine kleine Variante Ihres Ansatzes ... –

+0

bro Was ist Ihr Ziel mit diesem Code? Sie könnten 11 Zeilen entfernen (confirm (to_file)), weil cant existiert. – Milor123

+0

@ Milor123 Danke für deine Hilfe, ich wusste es vorher nicht. –

Antwort

3

Ich würde die Funktion ändern Sie die raw_input intern zu behandeln, können Sie etwas tun können, die in einer Schleife while die Eingabe nicht eine vorhandene Datei, und den Dateipfad zurück, wenn es ist eine vorhandene Datei.

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()) 

HINWEIS Dies setzt voraus, beide Dateien sind bereits vorhanden. Wenn Ihre Absicht ist die to_file zur Laufzeit zu erstellen, müssen wir einige Änderungen vornehmen. Lassen Sie mich wissen, wenn das der Fall ist ...

+0

Es spielt keine Rolle, da Aufrufe zum "Bestätigen" nichts mit dem tun, was zurückgegeben würde. –

+0

@ScottHunter siehe überarbeitete Antwort ... –

+0

Get ** HINWEIS **. Ich habe Code auf diese Weise geschrieben, nur weil ich nicht wusste, dass die Datei zur Laufzeit erstellt werden kann. Deine Antwort inspiriert mich sehr. –

2

Die Änderungen an file_name, die Sie innerhalb von confirm vornehmen, haben keinen Einfluss auf den Parameter, den Sie an diese Funktion übergeben haben. Sie sollten den endgültigen Wert file_name in confirm zurückgeben, und der Anrufer muss das der entsprechenden Variablen zuweisen.

+0

Eigentlich versuchte ich mit der Rückkehr, ich 'return file_name'vertically nach' file_name = raw_input ("Dateiname:") ', es hat immer noch nicht funktioniert, also habe ich versucht setze es vertikal mit 'While', aber es hat auch nicht funktioniert. –

+1

@WillBeethoven: Haben Sie den 'return file_name' _outside_ the' while' Loop gesetzt? Haben Sie den vom Funktionsaufruf 'confirm' zurückgegebenen Dateinamen zugewiesen? –

+0

@ PM 2Ring Vielen Dank! Von nun an verstehe ich, wie man Return verwendet. –

1

Remove Linie 11 (confirm (to_file)), die neue Datei kann nicht existiert

ich denke, dass Sie diese verwenden:

with open('file.txt', 'r') as f: 
    with open('newfile.txt', 'w') as nf: 
     nf.write(f.read()) 
Verwandte Themen