-2

我能做些什么来优化这个功能,让它看起来更像pythonic?

def flatten_rows_to_file(filename, rows):
    f = open(filename, 'a+')
    temp_ls = list()
    for i, row in enumerate(rows):
        temp_ls.append("%(id)s\t%(price)s\t%(site_id)s\t%(rating)s\t%(shop_id)s\n" % row)
        if i and i % 100000 == 0:
            f.writelines(temp_ls)
            temp_ls = []
    f.writelines(temp_ls)
    f.close()
4

2 回答 2

3

马上想到的几件事:

  1. 使用with语句,而不是手动关闭文件。
  2. 将生成器表达式传递给f.writelines而不是一遍又一遍地建立一个 100000 行列表(让标准库处理多少,如果有的话,它缓冲输出)。
  3. 或者,更好的是,使用该csv模块来处理编写制表符分隔的输出。

下面是一些改进代码的快速测试:

from csv import DictWriter

def flatten_rows_to_file(filename, rows):
    with open(filename, 'ab') as f:
        writer = DictWriter(f, ['id','price','site_id','rating','shop_id'],
                            delimiter='\t')
        writer.writerows(rows)

请注意,如果您使用的是 Python 3,则需要稍微不同的代码来打开文件。使用 mode'a'而不是'ab'并添加关键字参数newline=""。您不需要+使用您正在使用的模式(您只是在写作,而不是在写作和阅读两者)。

如果您的rows参数中的值可能具有超出您编写的键的额外键,则您还需要将一些额外的参数传递给DictWriter构造函数。

于 2013-10-22T08:29:46.813 回答
0

通常使用该with语句来确保文件正确关闭是一个好主意。此外,除非我弄错了,否则不需要手动缓冲这些行。您也可以在打开文件时指定缓冲区大小,确定文件刷新的频率

def flatten_rows_to_file(filename, rows, buffsize=100000):
    with open(filename, 'a+', buffsize) as f:
        for row in rows:
            f.write("%(id)s\t%(price)s\t%(site_id)s\t%(rating)s\t%(shop_id)s\n" % row)
于 2013-10-22T08:29:30.270 回答