使用python更新csv

时间:2016-10-28 20:30:14

标签: python csv dictionary dbf arcpy

我是python的新手,我正在开发一个项目来自动化几千个形状文件的映射过程。我最终的目标是将我的csv中的每一行都放到一个单独的.dbf dbase表中。我的csv最后一列中的信息格式不正确。我需要获取看起来像这样的数据:'R12D9L12U9'(这些是距离和方向调用)并将其转换为如下所示:'N 90-0-0 E,12,S 0-0-0 E, 9,N 90-0-0 W,12,N 0-0-0 E,9',以便映射.dbf文件。距离范围从1到大约200.我有一个脚本使用一个字典,用于将字母更改为各自的方向调用。我目前的问题是,当我尝试使用字典在距离(数字)之后添加逗号时,操作无法区分单数字,双数字和三位数字。例如,不是得到'12',而是得到'1,2',在某些情况下'1,2'。我需要一种更聪明的方式来阅读csv,可能使用列表,但是python的csv模块帮助文件只提到使用字典这些类型的操作。

以下是我的代码中处理此操作的部分:

#Importing OpenPyXl and loads the workbook and sheet.
import openpyxl, csv, xlrd, glob, pyexcel, arcpy, datetime, time
wb = openpyxl.load_workbook('TESTVECT.xlsx')
ws = wb.get_sheet_by_name('TEST')


print "{o,o}" + '\tStart @ ' + datetime.datetime.fromtimestamp(time.time()).strftime('%H:%M:%S')
print "/)__)"
print ' " " '

#allows to save more than once.
write_only = False

#Sets a variable for all rows in a sheet.
maxRow = ws.max_row + 1

#xlsx to csv
wb1 = xlrd.open_workbook('TESTVECT.xlsx')
sh1 = wb1.sheet_by_name('TEST')
your_csv_file = open('TESTVECT.csv', 'wb')
wr = csv.writer(your_csv_file, quoting=csv.QUOTE_ALL)
for rownum in xrange(sh1.nrows):
    wr.writerow(sh1.row_values(rownum))
your_csv_file.close()

#Creates a dictionary for the direction conversion.
directionUpdates = {'1':'1,','2':'2,','3':'3,','4':'4,','5':'5,','6':'6,','7':'7,','8':'8,','9':'9,','10':'10,','11':'11,','12':'12,','13':'13,','14':'14,','15':'15,','16':'16,','17':'17,','18':'18,','19':'19,','20':'20,','21':'21,','22':'22,','23':'23,','24':'24,','25':'25,',
                    '26':'26,','27':'27,','28':'28,','29':'29,','30':'30,','31':'31,','32':'32,','33':'33,','34':'34,','35':'35,','36':'36,','37':'37,','38':'38,','39':'39,','40':'40,','41':'41,','42':'42,','43':'43,','44':'44,','45':'45,','46':'46,','47':'47,','48':'48,','49':'49,','50':'50,',
                    '51':'51,','52':'52,','53':'53,','54':'54,','55':'55,','56':'56,','57':'57,','58':'58,','59':'59,','60':'60,','61':'61,','62':'62,','63':'63,','64':'64,','65':'65,','66':'66,','67':'67,','68':'68,','69':'69,','70':'70,','71':'71,','72':'72,','73':'73,','74':'74,','75':'75,','76':'76,','77':'77,','78':'78,','79':'79,','80':'80,','81':'81,','82':'82,','83':'83,','84':'84,','85':'85,','86':'86,','87':'87,','88':'88,','89':'89,','90':'90,','91':'91,','92':'92,','93':'93,','94':'94,','95':'95,','96':'96,','97':'97,','98':'98,','99':'99,','100':'100,',
                    '101':'101,','102':'102,','103':'103,','104':'104,','105':'105,','106':'106,','107':'107,','108':'108,','109':'109,','110':'110,','111':'111,','112':'112,','113':'113,','114':'114,','115':'115,','116':'116,','117':'117,','118':'118,','119':'119,','120':'120,','121':'121,','122':'122,','123':'123,','124':'124,','125':'125,','126':'126,','127':'127,','128':'128,','129':'129,','130':'130,','131':'131,','132':'132,','133':'133,','134':'134,','135':'135,','136':'136,','137':'137,','138':'138,','139':'139,','140':'140,','141':'141,','142':'142,','143':'143,','144':'144,','145':'145,','146':'146,','147':'147,','148':'148,','149':'149,','150':'150,'}

#Defines the replacement operation as the 'replace_all' function that can be used later.
def replace_all(text, dic):
    for i, j in directionUpdates.items():
        text = text.replace(i, j)
    return text
#This is the starting .csv file that will be corrected for directions
with open('TESTVECT.csv','r') as f:
    text=f.read()
    text=replace_all(text,directionUpdates)
with open('TESTVECT.csv','w') as w:
    w.write(text)

directionUpdates = {'L': 'N 90-0-0 W,','R':'N 90-0-0 E,','U':'N 0-0-0 E,','D':'S 0-0-0 E,'}


def replace_all_2(text, dic):
    for i, j in directionUpdates.items():
        text = text.replace(i, j)
    return text
#This is the starting .csv file that will be corrected for directions
with open('TESTVECT.csv','r') as f:
    text=f.read()
    text=replace_all_2(text,directionUpdates)
with open('TESTVECT.csv','w') as w:
    w.write(text)

我知道我的字典看起来非常草率,必须有更好的方法才能使这项操作成为可能。

1 个答案:

答案 0 :(得分:0)

不完全确定这是否是你的问题。但是,您可以在每个数字后添加昏迷。但是,这会将每个数字与字母分开,然后将它们连接在一起再次在每个项目之间添加逗号。

import re

inputD =  'R12D9L12U9'
numbersSplit = re.split('(\d+)',inputD)
addComa = ','.join(numbersSplit)
print addComa

输出结果:R,12,D,9,L,12,U,9