首页 > 解决方案 > 提高将数据附加到文件的效率

问题描述

我正在测试将数据附加到文件末尾的不同速度。

该文件保存为 .txt。该文件的内容是一个字典列表。

示例 dict:为简单起见,{'posted': ['2020-09-06T22:27:56.849149+00:00', '2020-09-06T22:27:56.849149+00:00'], 'seller_name': ['cheesetoken', 'cheesetoken'], 'seller_is_NPC': [False, False], 'Listings_sold': 2, 'quality': 2, 'price': 0.256, 'quantity_sold': 296554, 'datetime': datetime.datetime(2020, 9, 7, 0, 22, 27, 490902)}我将其简称为。{data}

该文件将随着时间的推移继续变大,但目前大小为 1MB,并且每 14-21 天将增加约 1MB。

我想将数据附加到此列表中。我要附加的数据将自己添加到列表中。如果我已经[{data1},{data2},{data3},{data4}]保存到磁盘并且我想追加[{data5},{data6}],我希望能够轻松读取数据(不必像这样保存)为[{data1},{data2},{data3},{data4},{data5},{data6}]

我这样做的原始代码是:

    for x in formatted_sell_list:
        content = x.copy()
        file_name = str(db_number) + '- Q' + str(loop)
        if len(x) > 0:

            try:
                with open(path, str(file_name)) + '.txt', "r") as file1:
                    data = eval(file1.read())
                    file1.close()

            except:
                # print('Error no file to read: ' + str(db_file_name) + '.txt')
                data = []

            data = data + content

            with open(path, str(file_name)) + '.txt', "w") as file1:  # Overwriting
                file1.write(str(data))
                file1.close()

        loop = loop + 1

我觉得这可能是一种非常低效的方法,读取整个文件,评估它,附加到列表并覆盖。我决定逐行追加可能会更好,所以我使用了这个:

    for x in formatted_sell_list:
        content = x.copy()
        file_name = str(db_number) + '- Q' + str(loop) +' NEW'
        if len(x) > 0:

            for write_me in content:
                # Open the file in append & read mode ('a+')
                with open(path, str(file_name)) + '.txt', "a+") as file_object:

                    # Append text at the end of file
                    file_object.write(str(write_me))
                    file_object.write("\n")

        loop = loop + 1

我将它们并排运行,并使用 time.time() 计算每段代码花费的时间。我发现在 100% 的情况下(文件大小在 1.3MB 和 1KB 之间),旧方法更快。平均而言,它的运行速度提高了 4.5 倍。进一步的测试表明,到目前为止,第二段代码中最耗时的部分是打开文件。

任何使此代码更快/更高效的建议将不胜感激。

编辑代码:

for x in formatted_sell_list:
    # print('loop = ' + str(loop))
    content = x.copy()
    file_name = str(db_number) + '- Q' + str(loop) +' NEW'
    # print('Writing to ' + str(db_file_name) + ", " + str(content))
    if len(x) > 0:

        # Open the file in append & read mode ('a+')
        with open(os.path.join(r'C:\Users\PC\PycharmProjects\Simcompanies\Files\RecordedSales2',
                               str(file_name)) + '.txt', "a+") as file_object:

            for write_me in content:

                    # Append text at the end of file
                    file_object.write(str(write_me))
                    file_object.write("\n")

标签: python

解决方案


I/O 操作代价高昂。

尽量减少你的写作。将您的列表格式化为您想要的字符串格式,然后执行一次写入操作。

像这样的东西:

with open(file) as fh:
    fh.write('\n'.join(map(str, content)) + '\n')

推荐阅读