Python,批量转换度分秒到十进制度在.csv与成千上万的logging

我是一个初学Python的用户,我有麻烦理解一些事情。 我想在一个.csv文件中将2整列(lat,long)从度分秒(dms)转换成十进制度(dd)(即46°57'01“N到46.950278)。到目前为止,我已经把我的.csv中的标题改名为ArcGIS中可读的,然后我用Excel将°,'和N“replace为空格,然后把他们在一个新的.csv文件与他们各自的ID号(Acc_num)…想用Python,但无法弄清楚我的生活。 然后,我用逗号replace空格,以便能够转换每个节的坐标。 我也做了一个def将dms转换为dd,dm转换为dd和d转换为dd …这是因为我的一些坐标只是度数,有些只是度数分钟。 这里是我的.csv文件当前格式的概述:

Acc_num lat long 881138 80,24 87,38 882273 68,40 141 889843 56,55,28 91,49,02 787004 48 91,58 

我不知道如何将我的defs应用到.csv文件来做最后的转换。 我需要保持列表的顺序相同,因为我想将这些列重新插入原始的,更详细的.csv。

这是我到目前为止:

 import csv from itertools import izip filename = r'C:\workspace\code\hl.csv' filename_comma = r'C:\workspace\code\hundlich4.csv' def dms_dd(degrees, minutes, seconds): decimal = 0.0 if (degrees >= 0): decimal = degrees + float(minutes)/60 + float(seconds)/3600 else: decimal = degrees - float(minutes)/60 - float(seconds)/3600 return decimal def dm_dd(degrees, minutes): decimal = 0.0 if (degrees >= 0): decimal = degrees + float(minutes)/60 else: decimal = degrees - float(minutes)/60 return decimal def d_dd(degrees): decimal = 0.0 if (degrees >= 0): decimal = degrees else: decimal = degrees return decimal accession = [] latitudes = [] longitudes = [] f = open(filename) for line in f: cells = line.split(',') accession.append((cells[0])) latitudes.append((cells[1])) latitudes = [w.replace(' ', ',') for w in latitudes] longitudes.append((cells[2])) longitudes = [w.replace(' ', ',') for w in longitudes] longitudes = [w.replace('\n', '') for w in longitudes] #puts commas where spaces are for the coordinates f.close() with open('C:\workspace\code\hundlich4.csv', 'wb') as fn: writer = csv.writer(fn) writer.writerows(izip(accession, latitudes, longitudes)) #writes columns with commas to a new csv called hundlich4.csv 

现在我一直在研究这个问题,而且我知道这是错误的,但是我不知道该怎么做转换来实现我的defs。

 accession2 = [] latitudes2 = [] longitudes2 = [] ff = open(filename) for line in ff: cells = line.split(',') accession2.append((cells[0])) latitudes2.append((cells[1])) for val in latitudes2: dms_dd(val) longitudes2.append((cells[2])) #longitudes2 = [w.replace(dms_dd(val) for w in longitudes] ff.close() 

任何帮助是极大的赞赏! 谢谢!

首先编写一个函数来转换一行input,然后遍历input行:

 import csv filename = r'C:\workspace\code\hl.csv' filename_decimal = r'C:\workspace\code\hundlich4.csv' def dms_dd(degrees, minutes=0, seconds=0): if degrees >= 0: decimal = degrees + minutes/60.0 + seconds/3600.0 else: decimal = degrees - minutes/60.0 - seconds/3600.0 return decimal def convert_line(data): return data[0], dms_dd(*map(float,data[1].split())), dms_dd(*map(float, data[2].split())) with open(filename) as inf: reader = csv.reader(inf) with open(filename_decimal) as outf: writer = csv.writer(outf) writer.write(next(reader)) # header for line in reader: writer.write(convert_line(line))