Python 零基础入门到实战(六)之数据处理:将CSV表格中的数据计算(两点直线距离)并逐行保存到一个新文件中、嵌套集合

对表格中的数据为不同点经纬度,做一个处理,即计算直线距离,并精确到小数点后三位,导出为一个矩阵,用于后续计算

昨天出门去亲戚家,什么也没学,今天在家,那就继续。刚好有一个需求如上题所述、

分析

其实拆解一下主要有三步
第一步,读csv file
第二步,计算一个站点到各站点的距离计算并保存到矩阵中
第三步,把结果写入新csv file中
这三步都不难
用我之前的1-5笔记中的知识即可解决!如果看不懂,可以翻翻我之前的笔记:
不论是CSV文件读写还是类型转换,Math,csv库调用,在前面的笔记都有体现,不再赘述。

公式

公式就是两点平方作差开根号,中间需要调用math库,方便代码编写,没什么难度

如何拆分一行?

主要就是输出的问题,在取得全部计算结果后我是放在了一个list当中,导出后,输出结果如下图所示:
在这里插入图片描述

解决方案一:循环控制语句输出

我所设想的是和IO流中的print一样,通过一个循环,每多少位,添加"\n"等符号来实现换行,但是在list中存在一个现象,就是,’\n’和’\r’等都算是其中的一个元素,就算添加成功后导出在表格里的单元格内换行了,但是整体还是一行的状态
由于手动拆分太费精力且容易出错,我还是想通过代码来实现这个挺普通的功能。
由于对csv库功能的不了解,使我想到了方案二
如果有您有更好的解决方法,效率更高的实现方法,请您在评论区留言,小弟会虚心学习。

解决方案二:嵌套集合

举个简单的例子:

In [4]: lst=[[2,3],[2,2]]

In [5]: print(lst)
[[2, 3], [2, 2]]

就上述代码就算导出到csv文件中就是一个矩阵形式了

AB
23
nullnull
22

于是我把每个站点到别的站点之间的直线距离都放到了一个list中就是subOD,其次,在把subOD.放到od中,这样就成了嵌套结构[[a,b,c][d,e,f]]

import csv
import math
import copy
f=open(r'C:\Users\ASUS\Desktop\MLCode\Data\station1.csv')
reader=csv.reader(f)
m=[]
for row in reader:
    m.append(row)
od=[]#outputdata
for i in range(1,53):
    subOD=[]#sub outputdata 
    for j in range(1,53):
        deltX=float(m[i][1])-float(m[j][1])
        deltY=float(m[i][2])-float(m[j][2])
        len=math.sqrt((deltX**2)+(deltY**2))
        subOD.append(round(len,3))
    od.append(subOD)
print(od)
csvFile= open('outPutData.csv','w',newline="")
writer=csv.writer(csvFile)
writer.writerows(od)
csvFile.close()

在导出后,确实成了一个矩阵,但是还存在一个问题
矩阵的每行中间多了一个换行,解决的话很简单通过open中的newline=""属性就可以搞定
最终效果如下图所示:
在这里插入图片描述
每天进步一点,技术还是为需求服务的,对python我学习的还是不够系统,不够深入。
以上浅薄的理解,希望能帮助到刚学python的盆友、如果您有更好的想法,请在评论区留言交流!感谢您的阅读

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会写程序的程序员.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值