如果先前字段为空,则使用先前数据填充表中的下一个字段

时间:2015-10-30 14:07:41

标签: python csv pyqt4 qgis

我有一个CSV直接与我在QGIS 2.8中开发的应用程序中的一系列点和线进行通信。但是,CSV有点问题。提供CSV数据的硬件每隔几行只提供位置数据。也就是说,有一个带有指定X和Y列的属性表,其字段仅在关键时刻填充。其余的是其他仍然有用的数据,但位置只是间歇性更新。

我的点要素已经过结构化,因此只有最底层(最近的)属性行用于显示一个点。当然,我需要最底部行的位置数据,否则该点消失。目前我没有得到它,但偶尔会得到它。我的CSV - >当前点代码(使用pyshp库):

        cur_dir = os.path.dirname(os.path.realpath(__file__))

        file_location = os.path.join(cur_dir, "data", "mycsv.csv")
        out_file = os.path.join(cur_dir, "data", "mypoint.shp")
        idd, az, y, x = [], [], [], []

        with open(file_location, 'rb') as csvfile:
            r = list(csv.reader(csvfile, delimiter=','))
            reader = r[len(r) - 1:] #read only top row
            for i, row in reversed(list(enumerate(reader))): #reverse table
                idd.append(str(row[0]))
                az.append(float(row[2]))
                y.append(float(row[6]))
                x.append(float(row[7]))
                print "appended"


        w = shapefile.Writer(shapefile.POINT)
        w.field('ID', 'N')
        w.field('AZIMUTH', 'N', 12)
        w.field('Y', 'F', 10, 8)
        w.field('X', 'F', 10, 8)

        for j, k in enumerate(x): #write shapefile
            w.point(k, y[j])
            w.record(idd[j],az[j],y[j], k )
            print "recorded"

        w.save(out_file)

以下是CSV的一个片段。您会在右侧看到切碎的列:http://i.stack.imgur.com/ULZOS.png

我首先尝试在多个枚举器下面的不同位置添加if x > 0:条件,以便在读取数据之前停止数字化,但每次都会给出错误min() arg is an empty sequence。我甚至不确定这是一个正确的开始,因为它可能只是将属性彼此不按顺序排列。我真的只需要某种"如果X或Y字段为空,则使用先前字段的数据填充字段"脚本。

我正在使用Python 2.7和PyQt4,开发出QGIS 2.8 API,并在Ubuntu 14.04上运行,

1 个答案:

答案 0 :(得分:1)

你可以缓存X和Y数据点的最后有效值,我假设它们在行[6]和行[7]

    with open(file_location, 'rb') as csvfile:
        r = list(csv.reader(csvfile, delimiter=','))
        reader = r[len(r) - 1:] #read only top row
        lastX = 0.
        lastY = 0.
        for i, row in reversed(list(enumerate(reader))): #reverse table
            idd.append(str(row[0]))
            az.append(float(row[2]))
            try:
                y.append(float(row[6]))
                lastY = float(row[6]))
            except (TypeError, ValueError) as e:
                if len(y) > 0:
                    y.append(lastY)

            try:
                x.append(float(row[7]))
                lastX = float(row[7]))
            except (TypeError, ValueError) as e:
                if len(x) > 0:
                    x.append(lastX)

            print "appended"

我假设丢失的CSV值是空字符串或无。当转换为float()时,这两个值都会引发异常。如果值为0,则要求原始dev将值设为空,因为0可以是实际坐标而不是缺少坐标。

如果X和Y总是在同一时间出现(如果你有一个,你总是拥有另一个),那么你可以使用一个try / except块来处理所有情况。