使用 python 更新 csv
Updating a csv with python
我是 python 的新手,我正在从事一个项目,以自动化数千个形状文件的映射过程。我的最终目标是将我的 csv 中的每一行放入一个单独的 .dbf 数据库 table。我的 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 文件为 mapped.The 距离可以从 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)
我知道我的字典看起来很草率,必须有更好的方法才能使此操作成为可能。
不完全确定这是否是您的问题。但是,这是在每个数字后添加逗号的方法。然而,这会将每个数字与字母分开,然后再次将它们重新组合在一起,并在每个项目之间附加逗号。
import re
inputD = 'R12D9L12U9'
numbersSplit = re.split('(\d+)',inputD)
addComa = ','.join(numbersSplit)
print addComa
输出结果:R,12,D,9,L,12,U,9
我是 python 的新手,我正在从事一个项目,以自动化数千个形状文件的映射过程。我的最终目标是将我的 csv 中的每一行放入一个单独的 .dbf 数据库 table。我的 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 文件为 mapped.The 距离可以从 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)
我知道我的字典看起来很草率,必须有更好的方法才能使此操作成为可能。
不完全确定这是否是您的问题。但是,这是在每个数字后添加逗号的方法。然而,这会将每个数字与字母分开,然后再次将它们重新组合在一起,并在每个项目之间附加逗号。
import re
inputD = 'R12D9L12U9'
numbersSplit = re.split('(\d+)',inputD)
addComa = ','.join(numbersSplit)
print addComa
输出结果:R,12,D,9,L,12,U,9