将文件从CSV转换为XML时索引超出范围

时间:2019-07-11 09:56:35

标签: python python-2.7

运行以下代码将csv转换为xml时,出现索引超出范围错误。

我在文件的一小部分下使用了16列的代码,它可以正常工作,但是当我尝试在30多个文件上尝试以下错误

Traceback (most recent call last):
  File "csv2xml.py", line 40, in <module>
    + rowData[i] + '</' + tags[i] + '>' + "\n")
IndexError: list index out of range
#!/usr/bin/python
import sys 
import os 
import glob 

delimiter = "," # "\t" "|" # delimiter used in the CSV file(s) 


# the optional command-line argument maybe a CSV file or a folder 
if len(sys.argv) == 2: 
    arg = sys.argv[1].lower() 
    if arg.endswith('.csv'): # if a CSV file then convert only that file 
        csvFiles = [arg] 
    else: # if a folder path then convert all CSV files in the that folder 
        os.chdir(arg) 
        csvFiles = glob.glob('*.csv') 
# if no command-line argument then convert all CSV files in the current folder 
elif len(sys.argv) == 1: 
    csvFiles = glob.glob('*.csv') 
else: 
    os._exit(1) 


for csvFileName in csvFiles: 
    xmlFile = csvFileName[:-4] + '.xml' 
    # read the CSV file as binary data in case there are non-ASCII characters 
    csvFile = open(csvFileName, 'rb') 
    csvData = csvFile.readlines() 
    csvFile.close() 
    tags = csvData.pop(0).strip().replace(' ', '_').split(delimiter) 
    xmlData = open(xmlFile, 'w') 
    xmlData.write('<?xml version="1.0" encoding="UTF-8" ?>' + "\n") 
    # there must be only one top-level tag 
    xmlData.write('<CTS>' + "\n") 
    for row in csvData: 
        rowData = row.strip().split(delimiter) 
        xmlData.write('<Product>' + "\n") 
        for i in range(len(tags)): 
            xmlData.write('    ' + '<' + tags[i] + '>'  
                          + rowData[i] + '</' + tags[i] + '>' + "\n") 
        xmlData.write('</Product>' + "\n")                 
    xmlData.write('</CTS>' + "\n") 
    xmlData.close()

1 个答案:

答案 0 :(得分:0)

听起来您的for循环遍历数据行应像这样检查rowData的长度:

tags_length = len(tags)
for row in csvData: 
    rowData = row.strip().split(delimiter) 
    xmlData.write('<Product>' + "\n") 
    if len(rowData) >= tags_length:
        for i in range(tags_length): 
            xmlData.write('    ' + '<' + tags[i] + '>'  
                          + rowData[i] + '</' + tags[i] + '>' + "\n") 
    xmlData.write('</Product>' + "\n")