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

时间:2015-10-23 08:05:41

标签: 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 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)

但我得到"IndexError: list index out of range"错误,据我所知,specName和spec list应该是索引大小为5.

1 个答案:

答案 0 :(得分:0)

阐述@DanielRoseman评论:python中列表的索引从零开始。这意味着以下列表

>>> l = [42, 23, 17]

包含三个项目

>>> len(l)
3

第一项(索引0)为42,第三项(索引2)为17:

>>> l[0]
42
>>> l[2]
17

虽然索引3没有项目,但它会指向列表中的第四项。

>>> l[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

因此,如果您将代码与包含五个元素的列表一起使用,则代码会崩溃。

修改

在您的情况下,错误可能来自另一个点。据我所知,代码(这意味着你正在使用的XML文件的结构一无所知),似乎总是得到specName和spec的长度列表。如果您尝试将其编入索引,如代码中所示,则会在那里遇到索引错误。

在您的代码中,您将获取每个specName / spec对并直接将其写入输出文件。这也意味着,您一次只能访问一个specName / spec对,因为您在while循环的每次迭代中都会覆盖它们。

要获得所需的输出格式,可能更容易保留两个列表(一个用于规范名称,一个用于规范本身),并在循环后批量写入结果。

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

这样可以省去转换的麻烦,也适用于任意数量的specNames / specs。

我希望这会有所帮助。