我有一个包含如下所示记录的文件:
t.test(age ~ gender, data=df, alternative='two.sided')
有大约1000万条记录,其中包含约300个独特的条形码,条形码的顺序是随机的。我的目标是将文件拆分为300个文件。我想通过生成记录的生成器只传递一次文件。
我过去通过多次读取文件或将整个文件加载到内存中解决了这个问题。我想使用生成器方法来解决问题,以减少内存使用量,并且只读取文件一次。
是否可以实例化300个生成器,并有一些逻辑将记录分派给正确的生成器?然后我可以简单地将每个生成器的内容写出到文件中。那么我是否需要对我想要一次写入的所有300个文件打开句柄?
答案 0 :(得分:1)
是的,它可以用发电机完成,但我们不需要300个,只需1个即可。
据我了解'uniqueid#BARCODE1'
条形码由两部分组成:
'>uniqueid#'
前缀,'BARCODE1'
条形码本身。所以让我们开始编写简单的检查器
BAR_CODE_PREFIX = '>uniqueid#'
def is_bar_code(text):
return text.startswith(BAR_CODE_PREFIX)
然后,为了解析条形码内容,我们可以编写生成器
def parse_content(lines):
lines_iterator = iter(lines)
# we assume that the first line is a barcode
bar_code = next(lines_iterator)
contents = []
for line in lines_iterator:
if is_bar_code(line):
# next barcode is found
yield bar_code, contents
bar_code = line
contents = []
else:
contents.append(line)
# to yield last barcode with its contents
yield bar_code, contents
然后假设你想在我们可以写的条形码之后命名文件
def split_src(src_path):
with open(src_path) as src_file:
for bar_code, content_lines in parse_content(src_file):
bar_code_index = bar_code[len(BAR_CODE_PREFIX):].rstrip('\n')
# we use `append` mode
# because in the different parts of file
# there are contents of the same barcode
with open(bar_code_index, mode='a') as dst_file:
dst_file.writelines(content_lines)
在整个档案中走了一次。
让我们创建一个由
组成的src.txt
文件
>uniqueid#BARCODE1
content11
>uniqueid#BARCODE2
content21
>uniqueid#BARCODE1
content12
content12
>uniqueid#BARCODE3
content31
>uniqueid#BARCODE2
content22
然后调用
split_src('src.txt')
将会创建下一个文件:
BARCODE1
行
content11
content12
content12
BARCODE2
行
content21
content22
BARCODE3
行
content31