Pytanie w sprawie python – W Pythonie, jak mogę otworzyć plik i odczytać go w jednym wierszu, a następnie móc zamknąć plik później?

5

Podczas wykonywania tego ćwiczenia wpadłem na problem.

from sys import argv
from os.path import exists

script, from_file, to_file = argv
print "Copying from %s to %s" % (from_file, to_file)

# we could do these two on one line too, how?
input = open(from_file)
indata = input.read()

print "The input file is %d bytes long" % len(indata)
print "Does the output file exist? %r" % exists(to_file)
print "Ready, hit RETURN to continue, CTRL-C to abort."

raw_input()

output = open(to_file, 'w')
output.write(indata)
print "Alright, all done."
output.close()
input.close()

Linia# we could do these two on one line too, how? to mnie myli. Jedyną odpowiedzią, jaką mogłem wymyślić, była:

indata = open(from_file).read()

Działało to tak, jak chciałem, ale wymaga ode mnie usunięcia:

input.close()

jako zmienna wejściowa już nie istnieje. Jak więc mogę wykonać tę operację?

Jak byś to rozwiązał?

Dziękuje wszystkim. Czuję się teraz lepiej. @ Paul D. Waite Dziękujemy za edycję mojego pytania. Teraz jest o wiele jaśniej. yoonsi
nie ma za co! Często łatwiej jest komuś innemu zobaczyć sedno pytania. Paul D. Waite

Twoja odpowiedź

7   odpowiedzi
2

input to tylko nazwa na coopen powraca, a nie jako rada, którą typowinien zrobić to w krótszy sposób.

Jak wspominają inne odpowiedzi, w tym konkretnym przypadku problem, który poprawnie zidentyfikowałeś, nie stanowi większego problemu - twój skrypt zamyka się dość szybko, więc wszelkie otwierane pliki zostaną dość szybko zamknięte. Ale nie zawsze tak jest, a zwykłym sposobem zagwarantowania zamknięcia pliku po jego zakończeniu jest użyciewith instrukcja - o której dowiesz się, kontynuując pracę z Pythonem.

0

yptu.

A nawet jeśli zliczanie zostanie zapisane, otrzymaszResourceWarning w Pythonie 3.2 dla każdego pliku, który zostanie automatycznie zamknięty. Sven Marnach
Prawdopodobnie. Ale przyzwyczajenie się do tego jest naprawdę złym pomysłem, ponieważ wtedy będziesz bezużyteczny dla większych programów, które z czasem muszą otwierać dużą liczbę plików. Przeliczaniemoże uratuj cię, ale potem jesteś związany z CPythonem i nie możesz, na przykład, zrobić programu 3x tak szybko, uruchamiając go na PyPy, ponieważ PyPy ma lepszy GC. Po prostu przyzwyczajaj się do uwalniania zasobów tak szybko, jak to możliwe. To naprawdę nie jest trudne. -1 user395760
0
in_file = open(from_file).read(); out_file = open(to_file,'w').write(in_file)
Postanowiłem więc to zadanie Jr Cord
Chociaż ten kod może odpowiedzieć na pytanie, brakuje mu wyjaśnienia. Rozważ dodanie tekstu, aby wyjaśnić, co on robi i dlaczego odpowiada na zadane pytanie. N. Wouda
2
with open(from_file, 'r') as f:
  indata = f.read()

# outputs True
print f.closed
0

Poniższy kod Pythona spełni Twoje zadanie.

from contextlib import nested

with nested(open('input.txt', 'r'), open('output.txt', 'w')) as inp, out:
    indata = inp.read()
    ...
    out.write(out_data)
@Lattyware, dzięki za informacje. Będę pamiętać. astynax
contextlib.nested nie ma sensu w nowszych wersjach Pythona. user395760
@delnan Gorzej niż tocontextlib.nested() powiniennigdy służy do otwierania dwóch plików - jeśli wystąpi błąd podczas otwierania drugiego, pierwszy nie zostanie zamknięty. Jest to udokumentowany błąd i jest to jeden z powodów, dla których jest on przestarzały na korzyść nowegowith składnia. Gareth Latty
14

Preferowanym sposobem pracy z zasobami w Pythonie jest użyciemenedżerowie kontekstu:

 with open(infile) as fp:
    indata = fp.read()

Thewith oświadczenie dba o zamknięcie zasobu i oczyszczenie.

tymógłby napisz to w jednym wierszu, jeśli chcesz:

 with open(infile) as fp: indata = fp.read()

jednak w python jest to uważane za zły styl.

Możesz także otworzyć wiele plików w awith blok:

with open(input, 'r') as infile, open(output, 'w') as outfile:
    # use infile, outfile

Zabawne, zapytałemdokładnie to samo pytanie kiedy zacząłem uczyć się python.

Dobry styl radzi, ale nie odpowiada na pytanie, ponieważ nie jest w jednej linii. Junuxx
@Junuxx Prawidłowa odpowiedź na to pytanie brzmi:nie rób tego w jednej linii. To najlepsza odpowiedź. Gareth Latty
@Lattyware: Daj spokój, to jest zadanie domowe i należy korzystać z niegowith, wydaje się oczywiste, że nie jest to odpowiedź, którą nauczyciel chce usłyszeć w tej konkretnej sytuacji. Junuxx
@Lattyware:While working through this exercise... i# we could do these two on one line too, how?. W przeciwnym razie zgadzam się, a ja +1 otrzymałem tę odpowiedź. Junuxx
0

tj.

in_file = open(from_file); indata = in_file.read()

Myślę, że to właśnie ty byłeś po ...

Powiązane pytania