Как создать цикл, который перебирает несколько массивов и записывать их в CSV? - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь написать скрипт, который очищает веб-страницу, содержащую четыре столбца, присваивает содержимое каждого столбца массиву, и в конце я хочу создать цикл for, который записывает элемент i'th каждого массива вих соответствующие столбцы в CSV.

Проблема у меня заключается в том, что я не знаю, как создать цикл for, который будет делать это. У меня уже написана функция f.write(). Я хочу, чтобы таблица выглядела следующим образом:

https://imgur.com/U5uKxO9

Вот код, который у меня есть. Пожалуйста, помните, что я все еще новичок:

from urllib.request import urlopen
from bs4 import BeautifulSoup

my_url = input()
uClient = urlopen(my_url)
page_css = uClient.read()
uClient.close()
page_soup = BeautifulSoup(page_css, "html.parser")

filename = "ge_scrape"
f = open(filename, "w")
headers ="Tag, , Name, , VR, , Value\n"
f.write(headers)

#The following for loops assign values from the columns 'tag', 'name', 'vr', and 'value' to an empty array
#so you can iterate over the arrays and print them in a .csv with a for loop that contains f.write().

tag_array = []
tag_containers = page_soup.findAll("td",{"id":"tag"})
for container in tag_containers:
    tag = container.get_text()
    tag_array.append(tag)

name_array =  []
name_containers = page_soup.findAll("td",{"id":"name"})
for container in name_containers:
    name = container.get_text()
    name_array.append(name)

vr_array =  []
vr_containers = page_soup.findAll("td",{"id":"vr"})
for container in vr_containers:
    vr = container.get_text()
    vr_array.append(vr)

val_array =  []
val_container = page_soup.findAll("td",{"id":"val"})
for container in val_container:
    val = container.get_text()
    val_array.append(val)

#Below is the attempted code:
i = 0
for (tag, name, vr, val) in zip(tag_array, name_array, vr_array, val_array):
    f.write(tag_array[i] + "," + name_array[i] + "," + vr_array[i] + "," + val_array[i] + "\n")
    i = i + 1

1 Ответ

0 голосов
/ 05 октября 2019

Если у вас массивы / списки одинаковой длины, вы можете использовать zip для объединения списков и возврата итератора кортежей. Если списки имеют разную длину, вы можете использовать itertools zip_longest и указать значение по умолчанию для отсутствующих.

import csv

list_A = [1,2,3,4]
list_B = ['a','b','c','d']
list_C = ['A','B','C','D']
list_D = [99,999,9999,99999]

with open("data.csv", "w", encoding="utf-8-sig", newline='') as csv_file:
    w = csv.writer(csv_file, delimiter = ",", quoting=csv.QUOTE_MINIMAL)
    w.writerow(['Col1','Col2','Col3','Col4'])
    for row in zip(list_A,list_B,list_C,list_D):
        w.writerow(row)
...