2011-03-22 59 views
1

更新:我设法解决这个问题,借助Jeremy的函数将我的数据集分为50个块。我已经发布了最终答案。Python:将一个数组划分为

我有下面的代码,我想将数组分成块的原因是,我试图使用一次只允许50个请求的api。另外我是java开发人员正在尝试转移到python。我想要做的是将数组分成50个块并将它们提供给api。

我有一个文本文件,它有很长的ID列表,我基于我读取的ID构建URL。

import simplejson as json 
import sys 
import urllib 
import traceback, csv, string 

# "base" API URL 
URL_BASE = 'Some URL' 
# set user agent string 
urllib.version = "Data Collection Fix it" 

page_ids = [] 

def divide_list(list_, n): 
    for i in range(0, len(list_), n): 
     yield list_[i:i + n] 

def issue_query(): 

    iFile = open('ReadFromThisFile.txt', "r") 
    lines = iFile.readlines() 
    #print len(lines) 

    for line in lines: 
     ids = string.split(line) 
     ids = ids[0] 
     page_ids.append(ids)    

    url = URL_BASE 
    indicies = range(len(page_ids)) 
    File = open("WriteToThisFile.csv", "w") 
    for indicies in divide_list(page_ids, 50): 
     count = 0 
     fiftyIds =[] 
     url = URL_BASE 
     for id in indicies: 
      str(id).strip 
      url += str(id) + '|' 
      print url 
      fiftyIds.append(str(id)) 
      count += 1 
     print count 
     rv = urllib.urlopen(url) 
     j = rv.read().decode("utf-8") 
     #sys.stderr.write(j + "\n") 
     data = json.loads(j) 
     for id in fiftyIds: 
      try: 
       s = int(data["query"]["pages"][id]["revisions"][0]["size"]) 
       sys.stderr.write("%d\t%d\n" % (int(id), s)) 
       File.write("%d\t%d\n" % (int(id), s)) 
       #print ("%d\t%d\n" % (int(id), s)) 
       # do something interesting with id and s 
      except Exception, e: 
       traceback.print_exc() 

    File.close() 
    iFile.close() 

issue_query() 

我知道很多经验Python开发人员可能给我负面的点问这样一个简单的问题,但我找不到对谷歌或有什么好例子。如果我重复了一个问题,那么很抱歉有什么麻烦。

感谢,

+2

为什么Perl开发人员关心你的Python的能力解决它? ;-) – Cameron 2011-03-22 04:38:28

+0

可能的重复[你如何在Python中将列表分割成大小均匀的块?](http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly -sized-chunks-in-python) – kennytm 2011-03-22 04:41:30

+0

在Python中,一个列表是一个列表,而一个数组是这样的:(http://docs.python.org/library/array.html#module-array) – eyquem 2011-03-22 14:19:08

回答

0

我想,而不是更新我原来的我应该做的回答问题的问题后。但愿它不是混乱,我已经把关于这个问题的部分,通知更新的评论,这个问题已经解决了,在这里我如何与杰里米银行功能的帮助下

import simplejson as json 
import sys 
import urllib 
import traceback, csv, string 

# "base" API URL 
URL_BASE = 'Some URL' 
# set user agent string 
urllib.version = "Data Collection Fix it" 

page_ids = [] 

def divide_list(list_, n): 
    for i in range(0, len(list_), n): 
     yield list_[i:i + n] 

def issue_query(): 

    iFile = open('ReadFromThisFile.txt', "r") 
    lines = iFile.readlines() 
    #print len(lines) 

    for line in lines: 
     ids = string.split(line) 
     ids = ids[0] 
     page_ids.append(ids)    

    url = URL_BASE 
    indicies = range(len(page_ids)) 
    File = open("WriteToThisFile.csv", "w") 
    for indicies in divide_list(page_ids, 50): 
     count = 0 
     fiftyIds =[] 
     url = URL_BASE 
     for id in indicies: 
      str(id).strip 
      url += str(id) + '|' 
      print url 
      fiftyIds.append(str(id)) 
      count += 1 
     print count 
     rv = urllib.urlopen(url) 
     j = rv.read().decode("utf-8") 
     #sys.stderr.write(j + "\n") 
     data = json.loads(j) 
     for id in fiftyIds: 
      try: 
       s = int(data["query"]["pages"][id]["revisions"][0]["size"]) 
       sys.stderr.write("%d\t%d\n" % (int(id), s)) 
       File.write("%d\t%d\n" % (int(id), s)) 
       #print ("%d\t%d\n" % (int(id), s)) 
       # do something interesting with id and s 
      except Exception, e: 
       traceback.print_exc() 

    File.close() 
    iFile.close() 

issue_query() 
3

很可能有一个内置的函数来做到这一点,但我不能把它。

#!/usr/bin/env python2.7 

def divide_list(list_, n): 
    """Produces an iterator over subsections of maximum length n of the list.""" 

    for i in range(0, len(list_), n): 
     yield list_[i:i + n] 

用法示例:

print(list(divide_list([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 3))) 
# prints: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]] 

使用它制作的URL在你的例子:

BASE_URL = "http://example.com/blah?ids=" 
page_ids = range(0, 123) 

for indices in divide_list(page_ids, 50): 
    url = URL_BASE + "|".join(str(i).strip() for i in indices) 
    # then do something with url... 
    print(url) 

# prints: 
# http://example.com/blah?ids=0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49 
# http://example.com/blah?ids=50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99 
# http://example.com/blah?ids=100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122 
+0

生成器将是很好... – st0le 2011-03-22 04:51:50

+0

谢谢,所以在这种情况下,我将如何迭代结果中的每个元素的结果? – 2011-03-22 05:27:22

+0

我已经将示例扩展为您的示例格式的URL。这是清楚的吗? – 2011-03-22 13:14:35

3

发电机版本的Jeremy's answer

def divide_list(list_, n): 

    for i in range(0, len(list_), n): 
     yield list_[i:i + n] 


for chunk in divide_list([1,2,3,4,5], 2): 
    print chunk 
3

有配方中的itertools documentation(这真的值得一读,只是让你知道什么是当你需要它 - 而你需要它)。

def grouper(n, iterable, fillvalue=None): 
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args)