64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
# File Data Input/Output
|
|
|
|
import os
|
|
from dataclasses import dataclass
|
|
from pathlib import Path
|
|
|
|
# We will start combining much of what we've learned so far
|
|
# as we begin talking about more complex subjects. The first
|
|
# example will be working with a CSV (Comma Separated Value)
|
|
# file used to store user data.
|
|
|
|
# We create a data class named User()
|
|
@dataclass
|
|
class User():
|
|
email: str = ""
|
|
id: int = 0
|
|
first_name: str = ""
|
|
last_name: str = ""
|
|
|
|
# Build up the path to the data file
|
|
data_file = os.path.join("Data", "users.csv")
|
|
# The pathlib module provides streamlined methods of getting
|
|
# the entire contents of a file in one command.
|
|
# This is a fairly complex statement.
|
|
# 1) Create a Path() object to the data_file
|
|
# 2) Use the read_text() method to read in the entire file as a string
|
|
# 3) Use the split() method on the string data to split it into lines
|
|
# 4) Use a slice ([1:]) to remove the first line (the header)
|
|
csv_contents = Path(data_file).read_text().split("\n")[1:]
|
|
# The list which will contain User() objects
|
|
users = []
|
|
# Step through the lines one at a time
|
|
for line in csv_contents:
|
|
# Split the line on commas after stripping leading/trailing white space
|
|
parts = line.strip().split(",")
|
|
# If we don't get four elements from the split then go to the next line
|
|
if len(parts) != 4:
|
|
continue
|
|
# Create a new User() object from the split parts of the line
|
|
users.append(User(parts[0], parts[1], parts[2], parts[3]))
|
|
|
|
# Print them out
|
|
for user in users:
|
|
print(user)
|
|
|
|
# Now we'll write the data we have back to a new file.
|
|
# In this repository any file beginning with "test_" will
|
|
# be ignored so we'll use a file names of "test_userdata.csv"
|
|
|
|
csv_filename = os.path.join("Data", "test_userdata.csv")
|
|
# We open the file. If the open fails it just quietly continues
|
|
with open(csv_filename, "w") as f:
|
|
# Let's write a header to the CSV
|
|
line = "EMail Address,User ID,First Name,Last Name\n"
|
|
f.write(line)
|
|
# Now we walk through the user data and write it all to the file
|
|
user: User
|
|
for user in users:
|
|
line = user.email + ","
|
|
line += user.id + ","
|
|
line += user.first_name + ","
|
|
line += user.last_name + "\n"
|
|
f.write(line)
|
|
print(f"User data written to file: {csv_filename}") |