Python脚本不依赖于Excel宏

时间:2017-05-18 20:31:20

标签: python python-2.7 excel-vba vba excel

我有一个python脚本,它采用两组坐标并将它们相互比较并返回它们之间的最短距离。

Python处理繁重的工作,但是,python正在调用Excel宏来进行排序。

我的宏根据距离对列进行排序,然后删除值大于最短值的行。(python脚本将第一个坐标列表中的一个项目与第二个列表中的所有项目进行比较,创建重复项目)

我的问题是,如何优化它并抛弃Excel宏,并将python格式列表?删除行宏需要很长时间才能完成。

使用的所有文件都是.CSV

Example(In a temporary file):

set 1 LAT | set 1 LON | set 1 ID | set 2 LAT | set 2 LON | set 2 ID | distance  
LAT,      LON,    unique_ID1,    LAT_1,    LON_1,    unique_ID2,   100
LAT,      LON,    unique_ID1,    LAT_2,    LON_2,    unique_ID2,   55
LAT,      LON,    unique_ID1,    LAT_3,    LON_3,    unique_ID2,   38
LAT,      LON,    unique_ID1,    LAT_4,    LON_4,    unique_ID2,   15
LAT,      LON,    unique_ID1,    LAT_5,    LON_5,    unique_ID2,   77

这是需要对数据进行排序的内容。最终输出如下所示(在只有最短距离值的新文件中):

set 1 LAT | set 1 LON | set 1 ID | set 2 LAT | set 2 LON | set 2 ID | distance  
LAT,      LON,    unique_ID1,    LAT_4,    LON_4,    unique_ID2,   15

然后继续使用第1组中的下一对坐标。

编辑:我不是在寻找完整的编码答案,但可能会提供一些模块建议或示例。

1 个答案:

答案 0 :(得分:1)

如果它适合内存,我认为它必须,因为你正在使用具有行限制的excel,你可以使用pandas库很容易地做到这一点:

import pandas as pd

df = pd.read_csv('temp.csv')
df[df['distance'] == df['distance'].min()].to_csv('shortest_only.csv', index=False)

要在没有外部库的情况下执行此操作,您可以使用csv库,并遍历行,保留那些与每个行匹配最小值的行

import csv

with open('temp.csv', 'r') as file:
    minvalue = None
    rows = []
    header = file.readline()
    reader = csv.reader(file)
    for line in reader:
        rows.append(line)
        if minvalue:
            minvalue = min(int(line[-1]), minvalue)
            rows = [row for row in rows if int(row[-1]) == minvalue]
        else:
            minvalue = int(line[-1])

with open('shortest_only.csv', 'w', newline='') as out:
    out.write(header)
    shortest = csv.writer(out)
    shortest.writerows(rows)