处理一:将数据中所有信息有问题的那行信息删除。如样例中第4行数据,这一行数据只有3个元素,而其他行都有6个元素,所以删除第4行即可。再如最后一行第3个信息明显有问题,所以该行也是问题行,删除即可。将全部数据处理完之后,每行单个元素以逗号为分隔,写入文件test1。
输入数据样例
18 Jogging 102271561469000 -13.53 16.89 -6.4
18 Jogging 102271641608000 -5.75 16.89 -0.46
18 Jogging 102271681617000 -2.18 16.32 11.07
18 Jogging 3.36
18 Downstairs 103260201636000 -4.44 7.06 1.95
18 Downstairs 103260241614000 -3.87 7.55 3.3
18 Downstairs 103260321693000 -4.06 8.08 4.79
18 Downstairs 103260365577000 -6.32 8.66 4.94
18 Downstairs 103260403083000 -5.37 11.22 3.06
18 Downstairs 103260443305000 -5.79 9.92 2.53
6 Walking 0 0 0 3.214402
输出test1样例
18,Jogging,102271561469000,-13.53,16.89,-6.4
18,Jogging,102271641608000,-5.75,16.89,-0.46
18,Jogging,102271681617000,-2.18,16.32,11.07
18,Downstairs,103260201636000,-4.44,7.06,1.95
18,Downstairs,103260241614000,-3.87,7.55,3.3
18,Downstairs,103260321693000,-4.06,8.08,4.79
18,Downstairs,103260365577000,-6.32,8.66,4.94
18,Downstairs,103260403083000,-5.37,11.22,3.06
18,Downstairs,103260443305000,-5.79,9.92,2.53
我的代码
#!/usr/bin/env python3 #注释行,使脚本在不同的操作系统之间具有可移植性
import csv #导入python中的csv模块
import sys #导入python中的sys模块
input_file = sys.argv[1] #使用sys模块中的argv参数,传递给命令行的参数,也就是在命令行输入的内容
output_file = sys.argv[2] #同上
with open(input_file, 'r', newline='') as csv_in_file:
#将“input_file”打开为一个文件对象“csv_in_file”,“r”表示只读模式,说明打开“input_file”是为了读取数据
with open(output_file, 'w', newline='') as csv_out_file:
# 将“output_file”打开为一个文件对象“csv_out_file”,“w”表示可写模式,说明打开“input_file”是为了写入数据
# 注:with可以在语句结束时关闭文件对象
filereader = csv.reader(csv_in_file, delimiter=' ')
#使用csv模块中的reader函数创建一个名为“filereader”的文件读取对象,来读取输入文件里的行
filewriter = csv.writer(csv_out_file)
#使用csv模块中的writer函数创建一个名为“filereader”的文件写入对象,来将数据写入输出文件
for row_list in filereader: #创建一个for循环,在输入文件剩余各行里进行迭代
if len(row_list) == 6 and row_list[2] != '0':
#因为正确的是每行都要有六个元素,而且第三列的数字要不等于0才是要求的模式,所以调用if语句进行判断
filewriter.writerow(row_list) #满足条件的则被写入输出文件
处理二:将test1数据中所有动作的数目统计出来,将动作数目打印到屏幕。然后将动作数目变为100的倍数,多余的删除,将数据行写入输出文件test2。比如统计出Jogging的数量为3021次,那么打印出3021后只往输出文件test2中写入3000条。
我的代码
#!/usr/bin/env python3 #注释行,使脚本在不同的操作系统之间具有可移植性
import csv #导入python中的csv模块
import sys #导入python中的sys模块
input_file = sys.argv[1] #使用sys模块中的argv参数,传递给命令行的参数,也就是在命令行输入的内容
output_file = sys.argv[2] #同上
movementsDict = {} #创建一个名为"movementsDict"的空字典
inputData = [] #创建一个名为"inputData"的空列表
with open(input_file, 'r', newline='') as csv_in_file:
# 将“input_file”打开为一个文件对象“csv_in_file”,“r”表示只读模式,说明打开“input_file”是为了读取数据
filereader = csv.reader(csv_in_file)
#使用csv模块中的reader函数创建一个名为“filereader”的文件读取对象,来读取输入文件里的行
movementsList = [] #创建一个名为"movementsList"的空列表
for row_list in filereader: #创建一个for循环,在输入文件剩余各行里进行迭代
movementsList.append(row_list[1]) #应用列表里的qppend函数给列表里增加元素,我们所要增加的都是列表里各行索引为1的各个元素
for movement in movementsList:
if movement not in movementsDict:
movementsDict[movement] = 1
else:
movementsDict[movement] += 1 #通过字典对其中的元素来计数
for movement, movementsDict[movement] in movementsDict.items():
print('Movement: %-15s' % movement, end='')
print('Amount: ' + str(movementsDict[movement]))
movementsDict[movement] = movementsDict[movement] // 100 * 100
#为了以100为精确度,我们进行movementsDict[movement] = movementsDict[movement] // 100 * 100的运算,将多余的删去
inputData.append(movementsDict[movement])
#将满足条件的写入字典中
csv_in_file.seek(0, 0)
with open(output_file, 'w', newline='') as csv_out_file:
# 将“output_file”打开为一个文件对象“csv_out_file”,“w”表示可写模式,说明打开“input_file”是为了写入数据
filewriter = csv.writer(csv_out_file)
# 使用csv模块中的writer函数创建一个名为“filereader”的文件写入对象,来将数据写入输出文件
countWalking = 0
countJogging = 0
countUpstairs = 0
countDownstairs = 0
countStanding = 0
countSitting = 0
#将每个元素的初始值都记为0,以便后面统计其个数
for row_list in filereader:
# 创建一个for循环,在输入文件剩余各行里进行迭代
if row_list[1] == 'Walking':
if countWalking < inputData[0]:
filewriter.writerow(row_list)
countWalking += 1
#就拿这个Walking来举例,如果索引为1的元素是Walking,如果Walking的个数少于inputData[0]中统计的个数就写入输出文件中,个数加一,下面的都一样
elif row_list[1] == 'Jogging':
if countJogging < inputData[1]:
filewriter.writerow(row_list)
countJogging += 1
elif row_list[1] == 'Upstairs':
if countUpstairs < inputData[2]:
filewriter.writerow(row_list)
countUpstairs += 1
elif row_list[1] == 'Downstairs':
if countDownstairs < inputData[3]:
filewriter.writerow(row_list)
countDownstairs += 1
elif row_list[1] == 'Standing':
if countStanding < inputData[4]:
filewriter.writerow(row_list)
countStanding += 1
else:
if countSitting < inputData[5]:
filewriter.writerow(row_list)
countSitting += 1
处理三:将test2中的数据读出,每行只取最后3列,每行数据中的单个元素以空格隔开,写入文件test3。
我的代码
import sys #导入python中的sys模块
import csv #导入python中的csv模块
input_file=sys.argv[1] #使用sys模块中的argv参数,传递给命令行的参数,也就是在命令行输入的内容
output_file=sys.argv[2] #同上
with open(input_file,'r',newline='') as csv_in_file:
# 将“input_file”打开为一个文件对象“csv_in_file”,“r”表示只读模式,说明打开“input_file”是为了读取数据
with open(output_file,'w',newline='') as csv_out_file:
# 将“output_file”打开为一个文件对象“csv_out_file”,“w”表示可写模式,说明打开“input_file”是为了写入数据
filereader=csv.reader(csv_in_file)
# 使用csv模块中的reader函数创建一个名为“filereader”的文件读取对象,来读取输入文件里的行
filewriter=csv.writer(csv_out_file)
# 使用csv模块中的writer函数创建一个名为“filereader”的文件写入对象,来将数据写入输出文件
for row in filereader: #创建一个for循环,在输入文件剩余各行里进行迭代
ass=[] #创建一个名为"ass"的空列表,用来增加元素
ass.append(row[3])
ass.append(row[4])
ass.append(row[5])
#因为要求加入后三列的元素,则加入下标为3,4,5列的个元素
filewriter.writerow(row) #满足条件的写入输出文件
处理四:将test3中的数据读出,每行数据的单个元素用空格隔开,数据行与数据行用逗号隔开,每20个一行写入文件finally中,保证每行不会出现不够或者多出来的情况。
输出finally单行样例
我的代码
import csv #导入python中的csv模块
import sys #导入python中的sys模块
input_file = sys.argv[1] #使用sys模块中的argv参数,传递给命令行的参数,也就是在命令行输入的内容
output_file = sys.argv[2] #同上
i=0
row_list = [] #创建一个名为"row_list"的空列表,来保存所有的数据行
with open(input_file,'r',newline='') as csv_in_file:
# 将“input_file”打开为一个文件对象“csv_in_file”,“r”表示只读模式,说明打开“input_file”是为了读取数据
with open(output_file,'w',newline='') as csv_out_file:
# 将“output_file”打开为一个文件对象“csv_out_file”,“w”表示可写模式,说明打开“input_file”是为了写入数据
filereader = csv.reader(csv_in_file,delimiter=" ")
# 使用csv模块中的reader函数创建一个名为“filereader”的文件读取对象,来读取输入文件里的行
filewriter = csv.writer(csv_out_file,delimiter=" ")
# 将“output_file”打开为一个文件对象“csv_out_file”,“w”表示可写模式,说明打开“input_file”是为了写入数据
for row in filereader:
# 创建一个for循环,在输入文件剩余各行里进行迭代
i=i+1
row_list.append(row)
if i==20:
filewriter.writerow(row_list)
i=0
row_list = []
#遍历列表,当a等于20时,然后把数据添加到列表中。列表长度为20,这时就需要把元素添加到输出列表中,然后将i归零,将列表清空,继续下一轮拆分。
# 拆分完成之后,逐行写入输出文件即可。
这周有时间,把寒假的任务做了批注,方便后面复习。