Patrzę na to, jak zrobić wejście i wyjście pliku w Pythonie. Napisałem następujący kod, aby odczytać listę nazw (po jednym w wierszu) z pliku do innego pliku, jednocześnie sprawdzając nazwę względem nazw w pliku i dołączając tekst do wystąpień w pliku. Kod działa. Czy można to zrobić lepiej?
Chciałem użyć with open(...
instrukcji zarówno dla plików wejściowych, jak i wyjściowych, ale nie widzę, jak mogą znajdować się w tym samym bloku, co oznacza, że muszę przechowywać nazwy w tymczasowej lokalizacji.
def filter(txt, oldfile, newfile):
'''\
Read a list of names from a file line by line into an output file.
If a line begins with a particular name, insert a string of text
after the name before appending the line to the output file.
'''
outfile = open(newfile, 'w')
with open(oldfile, 'r', encoding='utf-8') as infile:
for line in infile:
if line.startswith(txt):
line = line[0:len(txt)] + ' - Truly a great person!\n'
outfile.write(line)
outfile.close()
return # Do I gain anything by including this?
# input the name you want to check against
text = input('Please enter the name of a great person: ')
letsgo = filter(text,'Spanish', 'Spanish2')
filter()
jest to funkcja wbudowana, dlatego prawdopodobnie powinieneś wybrać inną nazwę dla swojej funkcji.filter()
), zostanie ona znaleziona przed wbudowanymfilter()
Odpowiedzi:
Python pozwala na umieszczanie wielu
open()
instrukcji w jednymwith
. Rozdziel je przecinkami. Twój kod będzie wtedy:I nie, nic nie zyskujesz, umieszczając wyraźne
return
na końcu swojej funkcji. Możesz użyć,return
aby wyjść wcześniej, ale masz go na końcu, a funkcja zakończy się bez niego. (Oczywiście w przypadku funkcji, które zwracają wartość, służyreturn
do określania wartości do zwrócenia.)Używanie wielu
open()
elementówwith
nie było obsługiwane w Pythonie 2.5, gdy wprowadzonowith
instrukcję lub w Pythonie 2.6, ale jest obsługiwane w Pythonie 2.7 i Pythonie 3.1 lub nowszym.http://docs.python.org/reference/compound_stmts.html#the-with-statement http://docs.python.org/release/3.1/reference/compound_stmts.html#the-with-statement
Jeśli piszesz kod, który musi działać w Python 2.5, 2.6 lub 3.0, zagnieżdż
with
instrukcje, tak jak sugerują inne odpowiedzi lub użyjcontextlib.nested
.źródło
Użyj takich zagnieżdżonych bloków,
źródło
Możesz zagnieździć swoje klocki. Lubię to:
Jest to lepsze niż Twoja wersja, ponieważ gwarantujesz, że
outfile
zostanie zamknięty, nawet jeśli Twój kod napotka wyjątki. Oczywiście możesz to zrobić za pomocą try / wreszcie, alewith
jest to właściwy sposób na zrobienie tego.Lub, jak właśnie się dowiedziałem, możesz mieć wielu menedżerów kontekstu w instrukcji z opisem opisanym przez @steveha . Wydaje mi się, że jest to lepsza opcja niż zagnieżdżanie.
A w przypadku ostatniego drobnego pytania zwrot nie ma żadnego rzeczywistego celu. Usunę to.
źródło
Czasami możesz chcieć otworzyć zmienną liczbę plików i traktować każdy z nich tak samo, możesz to zrobić
contextlib
źródło