在python中更改当前csv数据格式(从行到列)

在python中更改当前csv数据格式(从行到列),python,csv,Python,Csv,我编写了一个脚本,从某个网站获取产品,并以csv格式保存数据。现在的问题是,有些产品的规格较少,而有些产品的规格更多,而有些产品根本没有。我解决了获取规格的问题,但输出数据以A1、A2、A3等格式存储在csv中,我希望它以A1、B1、C1等格式存储 这是一个csv数据示例: A B 1. ['Weight '] ['0.3430'] 2. ['Tag line'] ['Take Control'] 3. ['Model'] ['Rhythm R

我编写了一个脚本,从某个网站获取产品,并以csv格式保存数据。现在的问题是,有些产品的规格较少,而有些产品的规格更多,而有些产品根本没有。我解决了获取规格的问题,但输出数据以A1、A2、A3等格式存储在csv中,我希望它以A1、B1、C1等格式存储

这是一个csv数据示例:

   A              B
1. ['Weight ']    ['0.3430']
2. ['Tag line']   ['Take Control']
3. ['Model']      ['Rhythm RX40']
4. ['Type']       ['Smart Phone']
5. ['Processor']  ['Dual Core']
而我需要的是:

   A            B                C               D               E
1. ['Weight ']  ['Tag line']     ['Model']       ['Type']        ['Processor']
2. ['0.3430']   ['Take Control'] ['Rhythm RX40'] ['Smart Phone'] ['Dual Core']
这是我的python代码:

with open('exampleCOM-'+ '(rivo)' +'-products.csv', 'a+', newline='') as csvfile:
    csvwriter = csv.writer(csvfile, delimiter=',')

    for title in mainTree.xpath('(//*[@id="product_addtocart_form"]/div[@class="product-name"]/text())[2]'):
        title = title.strip()
        print (title)

    row_info = [title]

    csvwriter.writerow(row_info)

    while (mainTree.xpath("//tr[" + str(i) + "]")):
        specName = [specName for specName in mainTree.xpath("//tr[" + str(i) + "]/td[1]/text()")]

        spec = [spec for spec in mainTree.xpath("//tr[" + str(i) + "]/td[2]/text()")]

        row_info = [specName, spec]

        csvwriter.writerow(row_info)

        i += 1
我尝试的是:

row_info = [specName[1], specName[2], specName[3], specName[4], specName[5]]
row_info2 = [spec[1], spec[2], spec[3], spec[4], spec[5]]

csvwriter.writerow(row_info)
csvwriter.writerow(row_info2)

但是我得到了
“indexer-ror:list-index-out-range”
错误,据我所知,specName和spec-list的索引大小应该是5

详述@DanielRoseman注释:python中列表的索引从零开始。这意味着下面的列表

>>> l = [42, 23, 17]
包含三个项目

>>> len(l)
3
其中第一项(索引0处)为42,第三项(索引2处)为17:

不过,索引3中没有指向列表中第四项的项

>>> l[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
这样可以省去转换的麻烦,也可以用于任意数量的等级库名称/等级库


我希望这能有所帮助。

Python列表是基于0的。@DanielRoseman好的,那么我该如何实现我所需的格式?@DanielRoseman请告诉我该怎么做?你的列表肯定没有5项。您可以通过在执行第二个代码段(具有行_info2等的代码段)之前打印它们的长度来检查这一点,如
print(len(specName))
。我的猜测是,如果您在第一个代码段之后执行第二个代码段,您只会得到长度1。也许我已经发现了问题。我不确定你有100%个LXML(?)代码在那里(我从来没有用过它,我不知道你正在解析的文件的结构),所以考虑这是一个有根据的猜测。我编辑了答案。这部分解决了我的问题,谢谢。是的,它成功了。
>>> l[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
# initilize empty lists to collect specNames and specs
specs = []
specNames = []

while (mainTree.xpath("//tr[" + str(i) + "]")):
    specNames.append([specName for specName in mainTree.xpath("//tr[" + str(i) + "]/td[1]/text()")])

    specs.append([spec for spec in mainTree.xpath("//tr[" + str(i) + "]/td[2]/text()")])

    i += 1

# write all specNames as first row
csvwriter.writerow(specNames)

# write all specs as second row
csvwriter.writerow(specs)