【问题标题】:How can I write the data to csv column by column from for loop in python?如何从python中的for循环逐列将数据写入csv?
【发布时间】:2019-04-17 19:07:11
【问题描述】:

我有几个 for 循环,每个循环输出多行代码我需要逐列组合它们,我将附上下面的代码以解释和显示我的请求:

myFile = open('example2.csv', 'w')

links = driver.find_elements_by_css_selector('html body div#wrapper div.container.coins div.mt-3 div.col-12.row.p-0.m-0 div.col-lg-8.col-md-8.d-flex.justify-content-center.flex-md-row.align-middle.align-items-center.justify-content-md-start.p-0.m-0 div.mr-md-3.mx-2.mb-md-0.text-3xl.font-semibold')
for linka in links:
    linka = str(linka.text)
    print(linka+'\n')
links = driver.find_elements_by_xpath('/html/body/div[2]/div[4]/div[4]/div[3]/div[1]/div/div[2]')
for linkb in links:
    linkb = str(linkb.text)
    print(linkb+'\n')

links = driver.find_elements_by_css_selector('div.coin-link-row:nth-child(3)')
for linkc in links:
    linkc = str(linkc.text)
    print(linkc+'\n')

links = driver.find_elements_by_css_selector('html body div#wrapper div.container.coins div.mt-3 div.col-12.row.p-0.m-0.mb-2.d-flex.flex-column-reverse.flex-sm-row div.col-md-9.col-lg-7.p-0 div.d-flex.flex-column.mx-3.mx-sm-5.mx-md-0 div.coin-link-row.mb-md-0')
for linkd in links:
    linkd = str(linkd.text)
    print(linkd+'\n')
myData = [["Linka", "Linkb", "Linkc","Linkd"],
          [linka,linkb,linkc,linkd]]
with myFile:
    writer = csv.writer(myFile)
    writer.writerows(myData)

另外我通常会遇到这个错误

I/O operation on closed file

我需要 CSV 文件中的输出如下所示

Linka, Linkb, Linkc, Linkd
linka(loop no 1), linkb(loop no 1), linkc(loop no 1), linkd(loop no 1)
linka(loop no 2), linkb(loop no 2), linkc(loop no 2), linkd(loop no 2)
linka(loop no 3), linkb(loop no 3), linkc(loop no 3), linkd(loop no 3)
linka(loop no 4), linkb(loop no 4), linkc(loop no 4), linkd(loop no 4)

更新以下代码:

 for one in many:
                time.sleep(1)
                print(str(one.text) + '\n')
                one.click()
                with open('example2.csv', 'w') as myFile:
                    writer = csv.writer(myFile)
                    writer.writerow(["Linka", "Linkb", "Linkc", "Linkd"])
                    linksa = driver.find_elements_by_css_selector(
                        'html body div#wrapper div.container.coins div.mt-3 div.col-12.row.p-0.m-0 div.col-lg-8.col-md-8.d-flex.justify-content-center.flex-md-row.align-middle.align-items-center.justify-content-md-start.p-0.m-0 div.mr-md-3.mx-2.mb-md-0.text-3xl.font-semibold')
                    linksb = driver.find_elements_by_xpath('/html/body/div[2]/div[4]/div[4]/div[3]/div[1]/div/div[2]')
                    linksc = driver.find_elements_by_css_selector('div.coin-link-row:nth-child(3)')
                    linksd = driver.find_elements_by_css_selector(
                        'html body div#wrapper div.container.coins div.mt-3 div.col-12.row.p-0.m-0.mb-2.d-flex.flex-column-reverse.flex-sm-row div.col-md-9.col-lg-7.p-0 div.d-flex.flex-column.mx-3.mx-sm-5.mx-md-0 div.coin-link-row.mb-md-0')

                    for linka, linkb, linkc, linkd in zip(linksa, linksb, linksc, linksd):
                        writer.writerow([linka.text, linkb.text, linkc.text, linkd.text])

谢谢Barmar,你解决了我的问题(请大家投票支持@Barmar 的答案,因为我没有足够的声誉,实际上他应得的)

【问题讨论】:

  • myFile 来自哪里?好像已经关门了。
  • 如果你能简化这篇文章就好了into a MCVE
  • 应该是with open('example2.csv', 'w') as myFile:
  • @brunns 我添加了这一点,我已经在我的代码中添加了它但我没有将它复制到这里。
  • 我不明白你在做什么。每次循环都会覆盖linkblinkc 等。

标签: python loops csv for-loop


【解决方案1】:

您需要使用with open 而不仅仅是withdocs

要使用write_rows,您需要提供一个已准备好行的可迭代对象。您可以通过准备每个链接列表、链接 b 等然后将它们放在一起来做到这一点,如果您可以假设它们的数量总是相同的话。

linkbs = []
links = driver.find_elements_by_xpath('/html/body/div[2]/div[4]/div[4]/div[3]/div[1]/div/div[2]')
for linkb in links:
    linkb = str(linkb.text)
    linkbs.append(linkb)

# then put myData together
myData = [[linkas[i], linkbs[i], linkcs[i], linkds[i]] for i in range(0, len(linkas)]
# as Barmar suggested you could instead use zip()
# zip(linkas, linkbs, linkcs, linkds)
with open('example.csv', 'w') as myFile:
    writer = csv.writer(myFile)
    writer.writerows(myData)

你需要构建每个列表,我这里只做了一个例子,并且这个方法只有在每个列表长度相同的情况下才有效,否则你需要先考虑使它们长度相同或稍后捕获 indexError .

【讨论】:

  • 我认为他的主要问题是关于生成正确的 CSV 文件内容,而不是如何打开文件。
  • @Barmar,正是我想知道如何使用从提到的循环中出来的不同数据逐列输出数据
  • 明白了,那我会解决的。
  • @GiraffeMan91 我尝试了你的代码并得到了同样的错误I/O operation on closed file 并且 csv 文件中没有出现任何内容
  • 您能否发布所有关于 CSV 编写器和完整回溯的固定代码?
【解决方案2】:

您需要在一个循环中处理所有链接。您可以使用zip() 来合并所有列表。

linksa = driver.find_elements_by_css_selector('html body div#wrapper div.container.coins div.mt-3 div.col-12.row.p-0.m-0 div.col-lg-8.col-md-8.d-flex.justify-content-center.flex-md-row.align-middle.align-items-center.justify-content-md-start.p-0.m-0 div.mr-md-3.mx-2.mb-md-0.text-3xl.font-semibold')
linksb = driver.find_elements_by_xpath('/html/body/div[2]/div[4]/div[4]/div[3]/div[1]/div/div[2]')
linksc = driver.find_elements_by_css_selector('div.coin-link-row:nth-child(3)')
linksd = driver.find_elements_by_css_selector('html body div#wrapper div.container.coins div.mt-3 div.col-12.row.p-0.m-0.mb-2.d-flex.flex-column-reverse.flex-sm-row div.col-md-9.col-lg-7.p-0 div.d-flex.flex-column.mx-3.mx-sm-5.mx-md-0 div.coin-link-row.mb-md-0')

with open('example2.csv', 'w') as myFile:
    writer = csv.writer(myFile)
    writer.writerow(["Linka", "Linkb", "Linkc","Linkd"])
    for linka, linkb, linkc, linkd in zip(linksa, linksb, linksc, linksd)
        writer.writerow([linka, linkb, linkc, linkd])

对于更大的循环,您应该首先在循环之外编写标题行。然后每次循环都以追加模式打开文件。

with open('example2.csv', 'w') as myFile:
    writer = csv.writer(myFile)
    writer.writerow(["Linka", "Linkb", "Linkc","Linkd"])

for one in many:
    time.sleep(1)
    print(str(one.text) + '\n')
    one.click()

    linksa = driver.find_elements_by_css_selector('html body div#wrapper div.container.coins div.mt-3 div.col-12.row.p-0.m-0 div.col-lg-8.col-md-8.d-flex.justify-content-center.flex-md-row.align-middle.align-items-center.justify-content-md-start.p-0.m-0 div.mr-md-3.mx-2.mb-md-0.text-3xl.font-semibold')
    linksb = driver.find_elements_by_xpath('/html/body/div[2]/div[4]/div[4]/div[3]/div[1]/div/div[2]')
    linksc = driver.find_elements_by_css_selector('div.coin-link-row:nth-child(3)')
    linksd = driver.find_elements_by_css_selector('html body div#wrapper div.container.coins div.mt-3 div.col-12.row.p-0.m-0.mb-2.d-flex.flex-column-reverse.flex-sm-row div.col-md-9.col-lg-7.p-0 div.d-flex.flex-column.mx-3.mx-sm-5.mx-md-0 div.coin-link-row.mb-md-0')

    with open('example2.csv', 'a') as myFile:
        writer = csv.writer(myFile)
        for linka, linkb, linkc, linkd in zip(linksa, linksb, linksc, linksd)
            writer.writerow([linka, linkb, linkc, linkd])

【讨论】:

  • 我使用它@Barmar,但每次循环运行时都会出现问题,新输出会覆盖旧输出来自上一个循环
  • 之前的循环是什么?这用于从头开始创建整个文件。
  • 如果您想添加到文件而不删除旧内容,请在打开文件时使用a 而不是w。但是你会得到多个标题行。
  • 我想你看到了我,发生了什么事我得到了多个标题,并且只得到了我停止系统的最后一个循环的最后结果。
  • 你可以打开文件一次,写一个标题,然后写多个循环写入行。
猜你喜欢
  • 2012-12-17
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 2013-08-28
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
相关资源
最近更新 更多