我有一个任意长度的列表,我需要将它分成相同大小的块并对其进行操作.有一些明显的方法可以做到这一点,比如保留一个计数器和两个列表,当第二个列表填满时,将它添加到第一个列表并清空下一轮数据的第二个列表,但这可能非常昂贵.
我想知道是否有人对任何长度的列表都有一个很好的解决方案,例如使用生成器.
我一直在寻找有用的东西,itertools但我找不到任何明显有用的东西.但是可能会错过它.
(这个问题与这一个和这个问题有关,但那些是预先走动的发电机,这正是我想要避免的)
我想把一个发电机拆分成块.要求是:
我试过以下代码:
def head(iterable, max=10):
for cnt, el in enumerate(iterable):
yield el
if cnt >= max:
break
def chunks(iterable, size=10):
i = iter(iterable)
while True:
yield head(i, size)
# Sample generator: the real data is much more complex, and expensive to compute
els = xrange(7)
for n, chunk in enumerate(chunks(els, 3)):
for el in chunk:
print 'Chunk %3d, value %d' % (n, el)
Run Code Online (Sandbox Code Playgroud)
这有点工作:
Chunk 0, value 0
Chunk 0, value 1 …Run Code Online (Sandbox Code Playgroud) 我在这里看到一些关于如何将Python列表拆分成块的好帖子,比如如何在常量大小的块中拆分可迭代的块.大多数帖子涉及分割块或将列表中的所有字符串连接在一起,然后根据正常的片段例程进行限制.
但是,我需要根据字符限制执行类似的操作.如果您有一个句子列表但不能截断列表中的任何切片.
我能够在这里制作一些代码:
def _splicegen(maxchars, stringlist):
"""
Return a list of slices to print based on maxchars string-length boundary.
"""
count = 0 # start at 0
slices = [] # master list to append slices to.
tmpslices = [] # tmp list where we append slice numbers.
for i, each in enumerate(stringlist):
itemlength = len(each)
runningcount = count + itemlength
if runningcount < int(maxchars):
count = runningcount
tmpslices.append(i)
elif runningcount > int(maxchars):
slices.append(tmpslices)
tmpslices = []
count …Run Code Online (Sandbox Code Playgroud) 我经常batch()在Python中使用。自 ES6 以来,JavaScript 中是否有其他具有迭代器和生成器函数的替代方案?
我正在寻找使用 python 的 boto3 模块向 dynamodb 批量写入项目,我得到了这个。这是我第一次使用 aws cli 或 boto3。文档说当存在空值和可能不正确的数据类型时会发生验证异常错误,但我已经玩过所有这些并且它似乎不起作用。
dynamodb 是否只喜欢一次写入 25 个项目?如果是这样,我如何控制这些批次?
我的请求:
client = boto3.client('dynamodb')
response = client.batch_write_item(RequestItems=batch_dict)
Run Code Online (Sandbox Code Playgroud)
batch_dict 的顶部:
{'scraper_exact_urls': [{'PutRequest': {'Item': {'Sku': {'S': 'T104P3'},
'pps_id': {'N': '427285976'},
'scraper_class_name': {'S': 'scraper_class_name'},
'store_id': {'N': '1197386754'},
'updated_by': {'S': 'user'},
'updated_on': {'N': '1480714223'},
'updated_url': {'S': 'http://www.blah.com'}}}},
{'PutRequest': {'Item': {'Sku': {'S': 'T104P3'},
'pps_id': {'N': '427285976'},
'scraper_class_name': {'S': 'scraper_class_name'},
'store_id': {'N': '1197386754'},
'updated_by': {'S': 'user'},
'updated_on': {'N': '1480714223'},
'updated_url': {'S': 'http://www.blah.com'}}}},....
Run Code Online (Sandbox Code Playgroud)
架构:
属性:“pps_id”=>\Aws\DynamoDb\Enum\Type::NUMBER、“sku”=>\Aws\DynamoDb\Enum\Type::STRING、“scraper_class_name”=>\Aws\DynamoDb\Enum\Type: :STRING, "store_id"=>\Aws\DynamoDb\Enum\Type::NUMBER, "updated_url"=>\Aws\DynamoDb\Enum\Type::STRING, "updated_by"=>\Aws\DynamoDb\Enum\Type ::STRING, "updated_on"=>\Aws\DynamoDb\Enum\Type::NUMBER, 字段: …
我有一个很大的.csv文件,大小超过300 GB。我想将其分块成每个100,000,000行的较小文件(每行大约有55-60字节)。
我写了以下代码:
import pandas as pd
df = pd.read_csv('/path/to/really/big.csv',header=None,chunksize=100000000)
count = 1
for chunk in df:
name = '/output/to/this/directory/file_%s.csv' %s count
chunk.to_csv(name,header=None,index=None)
print(count)
count+=1
Run Code Online (Sandbox Code Playgroud)
这段代码可以正常工作,并且我在磁盘上有足够的内存来一次存储大约5.5-6 GB的内存,但是速度很慢。
有没有更好的办法?
编辑
我编写了以下迭代解决方案:
with open('/path/to/really/big.csv', 'r') as csvfile:
read_rows = csv.reader(csvfile)
file_count = 1
row_count = 1
f = open('/output/to/this/directory/file_%s.csv' %s count,'w')
for row in read_rows:
f.write(''.join(row))
row_count+=1
if row_count % 100000000 == 0:
f.close()
file_count += 1
f = open('/output/to/this/directory/file_%s.csv' %s count,'w')
Run Code Online (Sandbox Code Playgroud)
编辑2
我想提请注意Vor关于使用Unix / Linux split命令的评论,这是我找到的最快的解决方案。