Working with CSV files/shaare/lDIjmw
Working with CSV files
- CSV (Comma Separated Values) is a plain-text tabular format where each line is a row and fields are delimited (commonly by commas).
- Widely used for spreadsheets, database exports, DevOps reports or inventories.
- Python’s built-in
csvmodule handles reading, writing, quoting, delimiters, headers, and dialects. - Always open files with
newline=''andencoding='utf-8'for cross-platform consistency.
CSV Format Basics
- Each row represents a record; fields separated by a delimiter (comma by default).
- Optional header row defines column names.
- Fields containing delimiters, quotes, or newlines must be quoted (usually with double quotes).
- Alternative delimiters (tabs, semicolons) and quoting conventions are supported via dialects and parameters.
Reading CSV files with csv.reader
- Iterates over rows, returning each as a list of strings.
- Use
next(reader)to skip or extract the header. - Accepts
delimiter,quotechar, and other formatting parameters.
import csv
from pathlib import Path
csv_path = Path("servers.csv")
with csv_path.open("r", encoding="utf-8", newline="") as file:
reader = csv.reader(file)
header = next(reader)
print(f"Header: {header}")
for idx, row in enumerate(reader, start=1):
print(f"Row {idx}: {row}")
Reading with csv.DictReader
- Reads rows into dictionaries using the header row as keys.
- Access fields by column name instead of index.
- Optional
fieldnamesargument overrides header names.
import csv
from pathlib import Path
csv_path = Path("servers.csv")
with csv_path.open("r", encoding="utf-8", newline="") as file:
dict_reader = csv.DictReader(file)
print(f"Fieldnames: {dict_reader.fieldnames}")
for idx, record in enumerate(dict_reader, start=1):
print(f"Record {idx}: {record}")
Example of servers.csv
hostname,ip_address,role,status,tags
web01,10.0.1.5,webserver,running,"frontend,prod"
db01,10.0.2.10,database,maintenance,"backend,staging"
Writing with csv.writer
- Write rows from lists using
.writerow()or.writerows(). - Open file with
newline=''to avoid blank lines. - Control delimiter and quoting via parameters.
import csv
from pathlib import Path
data = [
["hostname", "ip_address", "role"],
["web02", "10.0.1.6", "webserver"],
["app01", "10.0.3.15", "application"],
]
out_path = Path("output_basic.csv")
with out_path.open("w", encoding="utf-8", newline="") as file:
writer = csv.writer(file)
writer.writerows(data)
Writing with csv.DictWriter
- Write dictionaries using
fieldnamesto define header and column order. - Call
.writeheader()before.writerows().
import csv
from pathlib import Path
records = [
{
"host": "web01",
"port": "80",
"status": "running"
},
{
"host": "db02",
"status": "maintenance",
"tags": "prod,finance"
}
]
out_dict_path = Path("output_dict.csv")
fieldnames = set()
for record in records:
fieldnames = fieldnames | record.keys()
with out_dict_path.open("w", encoding="utf-8", newline="") as file:
writer = csv.DictWriter(
file,
fieldnames=fieldnames,
restval="undefined",
extrasaction="ignore"
)
writer.writeheader()
writer.writerows(records)
(97)