python - 提高将数据附加到文件的效率
问题描述
我正在测试将数据附加到文件末尾的不同速度。
该文件保存为 .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")
解决方案
I/O 操作代价高昂。
尽量减少你的写作。将您的列表格式化为您想要的字符串格式,然后执行一次写入操作。
像这样的东西:
with open(file) as fh:
fh.write('\n'.join(map(str, content)) + '\n')
推荐阅读
- java - 在即时搜索期间处理 RxJava 中断异常
- python - if else 语句基于带有矢量化函数的 numpy 中的二进制数组
- avr - 在bascom中的函数内部使用len函数
- laravel - 雄辩的子查询
- html - addhandler ie.Documentcompleted ,新建 WebBrowserDocumentCompletedEventHandler(AddressOf DocumentCompleteIE) 错误
- eclipse - 如何将github gradle文件导入eclipse?
- c# - 如何将带有命名空间的 xml 拆分为几个具有格式保存的文件?
- jquery - 在模板中显示具有不同参数的图表 - 所有图表都是混合的
- python-3.x - 如何将 os.path 的文件名作为字符串返回?
- sql - 使用 IN 语句的 Where 子句中的 Case 语句