Как я могу записать данные в CSV столбец за столбцом из цикла for в Python? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть несколько циклов 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, потому что у меня недостаточно репутации для этого, на самом деле он этого заслуживает)

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Вам нужно обработать все ссылки за один цикл. Вы можете сделать это, используя 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])
0 голосов
/ 17 апреля 2019

Вам нужно использовать with open, а не просто with. документы

Чтобы использовать write_rows, вы предоставляете итерацию с уже подготовленными строками. Вы можете сделать это, подготовив каждый список ссылок, ссылок и т. Д., А затем соедините их вместе, если предположите, что они всегда равны количеству каждого.

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. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...