我设法完成了一个脚本来自动执行重复性任务。我在Python上的第一个!所以我现在正在自动化部件的过程中,我必须检索数据并格式化脚本以供使用。
以下是我的代码的相关部分:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
import csv
ie = 'C:\\Users\\dd\\Desktop\\IEDriverServer32.exe'
print(ie)
Iebrowswer = webdriver.Ie(ie)
Iebrowswer.get('https://ww3.example.com/')
Iebrowswer.find_element_by_class_name('gridrowselect').click()
print(len(Iebrowswer.find_elements_by_class_name('gridrow')))
Gridcells = Iebrowswer.find_elements_by_class_name('gridcell')
Gridinfo = [i.text for i in Gridcells]
print(Gridinfo)
csvfile = 'C:\\Users\\dd\\Desktop\\CSV1.csv'
with open(csvfile, "w") as output:
writer = csv.writer(output, lineterminator='\n')
for val in Gridinfo:
writer.writerow(['val'])
我设法得到了我想要的信息。所有的。现在,我最大的问题是当我制作CSV时数据发生了什么。它出错了。这是我打印到shell时得到的结果(一个小例子):
['5555', '1', 'Verified', '', '6666', '2', 'Verified', '']
我的excel / csv文件正在垂直显示:
Columnl
[5555]
[1]
[Verified]
[ ]
[6666]
[2]
[Verified]
[ ]
我想要的是我的数据在空白空间后显示水平,如下所示:
Column1 Column2 Column3 Column4
5555 1 Verified
6666 2 Verified
我已经查看过这里的文档和其他一些问题,但我并没有更接近理解csv库及其参数。我似乎总是陷入这些非常简单的事情。我唯一成功的是添加更多列来垂直显示数据嘲弄自己。
答案 0 :(得分:1)
我不确定为什么要将所有行作为单个列表返回。 writerow()
模块的csv
方法需要单个列表来表示一行。
for val in Gridinfo:
writer.writerow(['val'])
因此会为每个数据点赋予自己的行(请注意'val'
是一个字符串文字,因此这段代码的输出只是字符串的行" val"而不是你的实际数据)。
要做的第一件事就是将单个列表分成多个长度为4的列表。我已经从here借用了分块函数;您可以根据具体情况在答案中看到其他方法。
这将为您提供嵌套列表。这对于writerows()
方法来说是完美的(注意,复数)。
尝试:
def chunks(l, n):
n = max(1, n)
return [l[i:i+n] for i in range(0, len(l), n)]
with open(csvfile, "w") as output:
writer = csv.writer(output, lineterminator='\n')
writer.writerows(chunks(Gridinfo, 4))
编辑:
chunk()
功能:
n = max(1, n)
是防御性编程。它基本上阻止你指定一个0
或更短的块长度(这没有意义,并会抛出ValueError: range() arg 3 must not be zero
异常)。对于所有意图和目的,你可以删除它,它将工作正常;为了避免这样的错误,保持它是没有害处的。相当于:
def chunks(my_list, chunk_size):
new_list = [] # What we will return
chunk = [] # Individual sublist chunk
for item in my_list:
if len(chunk) < 3:
chunk.append(item)
else:
new_list.append(chunk) # Add the chunk to the output
chunk = [] # Reset for the next chunk
chunk.append(item) # Make sure the current "item" gets added to the new chunk
if len(chunk) >= 1: # Catch any stragglers that don't make a complete chunk
new_list.append(chunk)
return new_list
SUBLIST_LENGTH = 3
list_to_be_chunked = [1, 2, 3, 4, 5, 6, 7]
result = chunks(list_to_be_chunked, SUBLIST_LENGTH)
print(result)
答案 1 :(得分:0)
import numpy as np
import csv
csvfile = r'C:\temp\test.csv'
Gridinfo = ['5555', '1', 'Verified', '', '6666', '2', 'Verified', '']
arr = np.resize(Gridinfo,(len(Gridinfo)/4,4))
with open(csvfile, "w") as output:
writer = csv.writer(output, lineterminator='\n')
writer.writerows(arr)
#Output
5555 1 Verified
6666 2 Verified