0

我正在将我在 python 中创建的一组文件(将元数据/xml 记录转换为文本)中的一些文本数据导入到 excel 中。除了在文本只是在段落中的点处插入新行之外,它大部分工作正常。这是文件创建过程中的一个问题。

是否可以自动清理数据以将数据保留在同一行中,直到遇到转义/新字符?

由于该站点不允许附件,因此我在此处附上了示例。

  1. anz*_log.txt -- 我使用“^”作为分隔符的原始文本文件。如果excel可以使用它仅在存在时创建新行,我可以强制它在每个已知行的末尾添加另一个字符。
  2. anz*_xml.xls Excel 导入 - 工作表 (*log) 原始导入数据)并清理了我使用公式正确获取值的位置。
  3. rowChar_anz*log.txt - 原始文本文件,每行开头带有 ':;:' 以表明它应该是一个新行(与 1 相同,但行有额外的分隔符)

这只是在测试数据集上,我需要在 1000 个文件上运行它。请参阅第 9、13、54 行等中的问题。

我可以使用 python(或者如果需要 cygwing/SED)来

  1. 查找“行首”字符串 - ':;:' 和“行尾”字符串 ';:;'
  2. 如果两者都不存在于一行中,则将行附加到上一行

或者(理想情况下)可以在使用以下代码创建文件时完成此操作吗?也许使用 re.compile (如查询 CSV 并将原始 CSV 和结果写入单个 CSV Python)?

#-------------------------------------------------------------------------------
# Name:        Convert xml data to csv with anzlic tagged data kept seperate
# Purpose:  Also has an excel template to convert the data into standard columns
#
# Author:      georgec@atgis.com.au
#
# Created:     05/03/2013
# Copyright:   (c) ATGIS. georgec 2013
# Licence:     Creative Commons
#-------------------------------------------------------------------------------

import os, xml, shutil, datetime
from xml.etree import ElementTree as et

SourceDIR=r'L:\Vector_Data'
rootDir=os.getcwd()
log_name='vector'
x=0

def locatexml(SourceDIR,x, rootDir):
    xmllist=[]
    for root, dirs, files in os.walk(SourceDIR, topdown=False):
        for fl in files:
            currentFile=os.path.join(root, fl)
            ext=fl[fl.rfind('.')+1:]
            if ext=='xml':
                xmllist.append(currentFile)
                print currentFile
                x+=1
                try:
                    processxml(currentFile,x, rootDir)
                except:
                    print "Issue with file: "+ currentFile
                    log=open(rootDir+'\\'+log_name+'issue_xml_log.txt','a')
                    log.write(str(x)+'^'+currentFile+'\n')
                    log.close

    print "finished"
    return xmllist, x, currentFile

def processxml(currentFile,x, rootDir):
    from lxml import etree
    seperator='^'
    with open(currentFile) as f:
        tree = etree.parse(f)
    xmltaglist=[]
    for tagn in tree.iter(tag=None):
        #print tagn.tag
        xmltaglist.append(tagn.tag)
    if 'anzmeta' in str(tree.getroot()):
        log=open(rootDir+'\\'+log_name+'anzmeta_xml_log.txt','a')
        log.write(':;:'+seperator+str(x)+seperator+currentFile+seperator)
        for xmltag in xmltaglist:
            for element in tree.iter(xmltag):
                #print element[x]
                for child in element.getchildren():
                    print "{0.tag}: {0.text}".format(child)
                    log.write("{0.tag}".format(child)+"::"+"{0.text}".format(child)+seperator)
        log.write('\n')
        log.close
    else:
        print currentFile+" not an anzlic metadata file...logging seperately"
        log=open(rootDir+'\\'+log_name+'non_anzmeta_xml_log.txt','a')
        log.write(':;:'+seperator+str(x)+seperator+currentFile+seperator)
        for xmltag in xmltaglist:
            for element in tree.iter(xmltag):
                #print element[x]
                for child in element.getchildren():
                    print "{0.tag}: {0.text}".format(child)
                    log.write("{0.tag}".format(child)+"::"+"{0.text}".format(child)+seperator)
        log.write('\n')
        log.close

locatexml(SourceDIR,x, rootDir)
4

1 回答 1

1

找到答案....只需将 .replace('\n','') 添加到写入每个条目的命令中。几个小时前就应该想到这个!!!

于 2013-03-07T23:53:49.167 回答