2016-10-28 1 views
-2

Je suis très novice en python et je travaille sur un projet d'automatisation d'un processus de mappage de plusieurs milliers de fichiers de formes. Mon but éventuel est de placer chaque ligne de mon csv dans une table dbase séparée .dbf. L'information dans la dernière colonne de mon csv n'est pas correctement formatée. Je dois prendre les données qui ressemblent à ceci: 'R12D9L12U9' (ce sont des appels de distance et de direction) et le faire convertir en quelque chose comme ceci: 'N 90-0-0 E, 12, S 0-0-0 E, 9, N 90-0-0 W, 12, N 0-0-0 E, 9 ', pour que les fichiers .dbf soient mappés. Les distances peuvent aller de 1 à environ 200. J'ai un script qui utilise un dictionnaire pour changer les lettres à leurs appels de direction respectifs. Mon problème actuel est que lorsque j'essaie d'ajouter les virgules après les distances (les nombres) en utilisant le dictionnaire, l'opération ne peut pas faire la différence entre les nombres simples, doubles et triples. Par exemple, au lieu d'avoir «12», j'obtiendra «1,2», et dans certains cas «1,, 2». J'ai besoin d'un moyen plus intelligent de lire le fichier csv, possible en utilisant une liste, mais les fichiers d'aide du module csv de python mentionnent uniquement l'utilisation d'un dictionnaire de ce type d'opérations.Mise à jour d'un fichier csv avec python

Voici la partie de mon code qui traite de cette opération:

#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) 

Je sais que mon dictionnaire est très bâclée et il doit y avoir une meilleure façon de rendre cette opération possible.

Répondre

0

Vous ne savez pas exactement si c'était votre question. Cependant, voici comment vous pouvez ajouter la coma après chaque chiffre. Cependant, cela sépare chaque chiffre des lettres puis les réunit de nouveau en ajoutant une virgule entre chaque élément.

import re 

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

résultat de sortie: R,12,D,9,L,12,U,9

+0

Merci pour le soutien, vous étiez en mesure de comprendre ma question et me donner une excellente réponse! Voici le code que j'ai fini avec –

+0

Voici le code que j'ai fini avec: avec open ('TESTVECT.csv', 'rb') comme infile, ouvert ('TESTVECTNEW.csv', 'wb') comme fichier outfile: writer = csv.writer (outfile) pour ligne dans csv.reader (infile): inputD = row [2] numbersSplit = re.split ('(\ d +)', entréeD) addComa = ','. (numbersSplit) impression addComa ligne [2] = addComa writer.writerow (ligne) –