Python-Project-9-学习笔记

[TOC]

练习 1

  • 使用 open() 函数打开 artworks.csv 文件,将结果赋值给 opened_file
    • 可以使用 open('dataset/artworks.csv')
  • 使用 reader() 函数解析 opened_file 中的数据,将结果赋值给 read_file
  • 使用 list()read_file 转换为表的表,将结果赋值给 moma
  • 使用列表切片从 moma 列表的列表中删除第一行的列名
from csv import reader

path = './dataset/artworks.csv'
moma = list(reader(open(path, encoding='utf-8')))
moma = moma[1:]

练习 2

  • 使用 str.replace() 方法将 “I am thirty-one years old” 修改为 “I am thirty-two years old”
print("I am thirty-one years old".replace("one","two"))

练习 3

  • 请你按照相同方法删除 Gender 列中的括号(索引5
    • 为每一行的性别数据指定一个变量名并复制给它
    • 使用 str.replace() 方法删除左括号 ( 字符
    • 使用 str.replace() 方法删除右括号 ) 字符
    • 将清理后的值重新分配给 Gender 列(索引5
from csv import reader

opened_file = open('dataset/artworks.csv', encoding='utf-8')
read_file = reader(opened_file)
moma = list(read_file)
for row in moma:
gender = row[5]
gender = gender.replace("(", "")
gender = gender.replace(")", "")
row[5] = gender
print(moma[15])

练习 4

  • 集成上述功能,将 Gender【5】Nationality【2】 列的数据大小写统一,若缺少值的话需要标记为 Gender Unknown/OtherNationality unknown
from csv import reader

opened_file = open('dataset/artworks.csv', encoding='utf-8')
read_file = reader(opened_file)
moma = list(read_file)
print(moma[32]) # 我们以第33行为例进行验证

# 使数据集中的 Gender 首字母大写 —— 2
for row in moma:
row[5] = row[5].replace("(", "")
row[5] = row[5].replace(")", "")
if not row[5]:
row[5] = "Gender Unknown/Other"
if row[5] == 'male' or row[5] == 'female':
row[5] = row[5].title()

# 使数据集中的 Nationality 首字母大写 —— 2
for row in moma:
row[5] = row[5].replace("(", "")
row[5] = row[5].replace(")", "")
if not row[5]:
row[5] = "Nationality Unknown/Other"
else:
row[5] = row[5].title()

print(moma[32]) # 我们以第33行为例进行验证

练习 5

  • 集成上述代码,清理除第一行列名称外的前50组数据,输出格式为 [1928, 1984] 这样
  • 将在 for 循环中判断是否为空数据的功能移动到 clean_and_convert() 函数中,最终的输出效果不变
from csv import reader


def clean_and_convert(data, toInt=False, isCapitalize=False):
if not data:
return ''
data = data.replace("(", "")
data = data.replace(")", "")
if isCapitalize:
data = data.title()
if toInt:
data = int(data)
return data


opened_file = open('dataset/artworks.csv', encoding='utf-8')
read_file = reader(opened_file)
moma = list(read_file)[1:]

for row in moma[0:50]:
birth_date = clean_and_convert(row[3], toInt=True)
death_date = clean_and_convert(row[4], toInt=True)
print([birth_date, death_date])

练习 6

  • 让我们使用这种方法来清理整个数据集的 Date 列,为了简化操作,我们建议使用两个辅助变量:

    • test_data
      • 这是我们在上面看到的字符串列表。
      • 此列表代表数据集Date列中的值,
      • 它允许您在不查看17000个日期的情况下查看代码的效果。
    • bad_chars
    • 这是需要替换的字符列表。
    • 这意味着你要花时间考虑代码的结构,
    • 找到全部要删除的字符。
  • 最终效果,应该是所有 Date 列中的数据变成了一个年份或一个年份范围。

  • 创建一个名为strip_characters()的函数,该函数接受一个字符串参数并:

    • 遍历bad_chars列表,使用str.replace()删除每个字符。
    • 返回已清理的字符串。
  • 创建一个空列表,stripped_test_data

  • 迭代test_data中的字符串,每次迭代:

    • 使用前面创建的函数来清理字符串。
    • 将清理的字符串添加到stripped_test_data列表。
# 练习区域

from csv import reader


def strip_characters(data):
legal_str = "1234567890-"
out = ''
if not data:
return out
else:
for x in data:
if legal_str.count(x) > 0:
out += x
return out


opened_file = open('dataset/artworks.csv', encoding='utf-8')
read_file = reader(opened_file)
moma = list(read_file)[1:]

for row in moma:
print(strip_characters(row[6]))

练习 7

  • 使用上述回忆的函数和逻辑清理年份或年份范围数据,使得我们拿到一份干净的、只有4位数字的年份数据。
  • 为了完成这个练习,你可以构建一个名为process_date()的函数,该函数适用于每个 Date 列中的数据,当然我们建议你编写完这个函数后可以用一个小数据集进行测试,看看你写的函数有么有遇到报错。
  • 检查短划线字符(-)是否在字符串中,以确认该数据是否是一个年份范围。
  • 如果是一个年份范围:
    • 在破折号字符前后将字符串拆分为两个字符串。
    • 将这两个数字转换为整数类型,然后将这两个年份之和除以2来求平均值。
    • 使用round()函数对平均值进行舍入,以确保数据变成了整数,因此类似1964.5的值变为1964
  • 如果日期不是一个年份范围:
    • 将值转换为整数类型。
  • 最后,返回值。
  • 使用process_date()函数遍历moma列表。在每次迭代中:
    • Date列(索引6)中的值赋给变量。
    • 使用任务六中编写好的strip_characters()函数删除错误字符。
    • 使用process_date()函数转换日期。
    • 将剥离和处理后的值重新分配给对应行。
from csv import reader


def strip_characters(data):
legal_str = "1234567890-"
out = ''
if not data:
return out
else:
for x in data:
if x in legal_str:
out += x
return out


def process_date(data):
if not data:
return ''
if '-' in data:
[begin, end] = data.split('-')
return round((int(end)+int(begin))/2)
else:
return int(data)


opened_file = open('dataset/artworks.csv', encoding='utf-8')
read_file = reader(opened_file)
moma = list(read_file)[1:]

for row in moma:
row[6] = process_date(strip_characters(row[6]))
print(row[6])

总结

恭喜,你已经掌握了:

  • 删除不需要的字符以“清理”字符串数据。
  • 通过替换字符并统一大小写,使数据更加统一。
  • 处理数据清理过程中的错误。
  • 解析并清理复杂的字符串。

我们一起回顾刚刚遇到的困难和总结出来的经验:

语法

  1. 替换字符串中的子字符串:
green_ball = "red ball".replace("red", "green")
  1. 删除子字符串:
friend_removed = "hello there friend!".replace(" friend", "")
  1. 从字符串中删除一系列字符:
bad_chars = ["'", ",", ".", "!"]
string = "We'll remove apostrophes, commas, periods, and exclamation marks!"
for char in bad_chars:
string = string.replace(char, "")
  1. 将字符串转换为首字母大写:
Hello = "hello".title()
  1. 检查字符串中是否存在子字符串:
if "car" in "carpet":
print("The substring was found.")
else:
print("The substring was not found.")
  1. 将字符串拆分为字符串列表:
split_on_dash = "1980-12-08".split("-")
  1. 按位置从字符串中切出字符:
last_five_chars = "This is a long string."[:5]
  1. 连接字符串:
superman = "Clark" + " " + "Kent"

概念

  • Python中读取 CSV 格式的表格时,通常以“包含列表的列表”格式存储数据。