在Python csv

时间:2015-05-24 18:34:03

标签: python python-2.7 csv

我创建了一个从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

1 个答案:

答案 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"rw之一;然后可选择a(意思是通用换行符);然后可选地U(意思是读写而不是只读或只写),然后可选地+(意思是二进制而不是文本)。要求“读取+更新”和“附加+更新”都没有任何意义。当你不写它时,我不确定为什么你想要它处于任何可写模式。对于file2,我怀疑你想要附加到b(可能是你以前的运行中的垃圾堆不正确)而不是重新创建它,那么为什么要使用file2.csv?最后,当它们被认为是等效的时,打开一个二进制文件和另一个文本也是没有意义的。所以,我认为你的两种模式对于第一种模式应该是a而对于第二种模式应该是rb,但是请阅读文档,决定你想要什么,然后写下来。