我创建了一个从csv文件中获取search_id
的小程序,然后使用它来擦除webform以写入另一个csv文件(在此示例中为product name
和{{1 }}。)
price
示例 - 对于2行import csv
with open("file1.csv","rb+a") as file1_read:
r = csv.reader(file_read1, delimiter = ",")
for search_id in r:
# -- Logic for web scraping here, omitted --
with open("file_2.csv","a") as file2_write:
wr = csv.writer(file2_write, delimiter = ",")
wr.writerow(search_id)
wr.writerow(name)
wr.writerow(price)
,在3列中提供6行数据:
search_id
我得到三个单元格的原因是"价格"是因为我正在为一系列价格而努力。
现在,我想将其输出为:
id01
Coffee
$4 $5 $3
id02
Soda
$2 $3 $4
关于如何重新分配代码以输出到上述格式的任何想法?
更新:以下是更多代码:
Coffee id01 $4
Coffee id01 $5
Coffee id01 $3
Soda id02 $4
Soda id02 $5
Soda id02 $3
答案 0 :(得分:4)
您需要做的第一件事就是对输入进行分组。假设您的格式总是与您显示的格式完全相同,一种简单的方法是使用itertools
文档中的grouper
配方。假设您已将该配方复制到代码中(或已安装more_itertools
并从那里导入),并且您的已删除数据位于名为rows
的可迭代中,每行都是可迭代的列:< / p>
for group in grouper(rows, 3):
search_id = group[0][0]
name = group[1][0]
prices = group[2]
现在,您只需要将它们全部写为单独的行:
for price in prices:
wr_insref.writerow([search_id, name, price])
一件小事:您所需的输出似乎以制表符分隔,但您的代码明确指定delimiter=','
。显然其中一个是错的。如果输出正确,请使用delimiter='\t'
。
现在你已经展示了一些代码,它似乎与你描述的非常不同。实际上你根本没有获得分组数据;对于每个search_id
,您执行单独的查询,并返回单个product_name
和单个price
列表。如果是这种情况,您甚至不需要grouper
;这样做:
search_reply = driver.find_element_by_class_name("ac_results")
product_name = re.match("(.*?)\(", search_reply.text).group()
prices = re.findall("((?<=\()[0-9]*)", search_reply.text)
with open("file2.csv", "a") as file2_write:
wr = csv.writer(file2_write, delimiter = ",")
for price in prices:
wr.writerow([search_id, product_name, price])
但是,如果ac_results
实际上确实返回了多个组的内容,而不是原来暗示的问题,那么您不能单独找到所有产品名称和所有价格,并尝试将它们合并在一起;您必须先将其拆分为组,然后找到每个组的产品名称和价格清单。我不认为grouper
会对此有所帮助,但可能有一些非常简单的方法(没有人看到你的输入,没有人能为你找到,但我的猜测实际上是一个带有{的标签{1}}或class
您可以在id
内搜索而不是使用正则表达式,或者至少可以通过表格结构找到标签;如果没有,则需要更复杂的正则表达式)
最后一件事:您似乎在open
来电时抛出随机文件模式。 ac_results
无效,甚至不清楚您想要它的含义。假设您使用的是Python 2.x,则选择"rb+a"
,r
或w
之一;然后可选择a
(意思是通用换行符);然后可选地U
(意思是读写而不是只读或只写),然后可选地+
(意思是二进制而不是文本)。要求“读取+更新”和“附加+更新”都没有任何意义。当你不写它时,我不确定为什么你想要它处于任何可写模式。对于file2,我怀疑你想要附加到b
(可能是你以前的运行中的垃圾堆不正确)而不是重新创建它,那么为什么要使用file2.csv
?最后,当它们被认为是等效的时,打开一个二进制文件和另一个文本也是没有意义的。所以,我认为你的两种模式对于第一种模式应该是a
而对于第二种模式应该是rb
,但是请阅读文档,决定你想要什么,然后写下来。