diff --git a/Doc/library/csv.rst b/Doc/library/csv.rst --- a/Doc/library/csv.rst +++ b/Doc/library/csv.rst @@ -419,32 +419,36 @@ The simplest example of reading a CSV file:: import csv - reader = csv.reader(open("some.csv", newline='')) - for row in reader: - print(row) + with open("some.csv", newline='') as f: + reader = csv.reader(f) + for row in reader: + print(row) Reading a file with an alternate format:: import csv - reader = csv.reader(open("passwd"), delimiter=':', quoting=csv.QUOTE_NONE) - for row in reader: - print(row) + with open("passwd") as f: + reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE) + for row in reader: + print(row) The corresponding simplest possible writing example is:: import csv - writer = csv.writer(open("some.csv", "w")) - writer.writerows(someiterable) + with open("some.csv", "w") as f: + writer = csv.writer(f) + writer.writerows(someiterable) Since :func:`open` is used to open a CSV file for reading, the file will by default be decoded into unicode using the system default encoding (see :func:`locale.getpreferredencoding`). To decode a file using a different encoding, use the ``encoding`` argument of open:: - import csv - reader = csv.reader(open("some.csv", newline='', encoding='utf-8')) - for row in reader: - print(row) + import csv + with open("some.csv", newline='', encoding='utf-8') as f: + reader = csv.reader(f) + for row in reader: + print(row) The same applies to writing in something other than the system default encoding: specify the encoding argument when opening the output file. @@ -453,18 +457,20 @@ import csv csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE) - reader = csv.reader(open("passwd"), 'unixpwd') + with open("passwd") as f: + reader = csv.reader(f, 'unixpwd') A slightly more advanced use of the reader --- catching and reporting errors:: import csv, sys filename = "some.csv" - reader = csv.reader(open(filename, newline='')) - try: - for row in reader: - print(row) - except csv.Error as e: - sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e)) + with open(filename, newline='') as f: + reader = csv.reader(f) + try: + for row in reader: + print(row) + except csv.Error as e: + sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e)) And while the module doesn't directly support parsing strings, it can easily be done::