在不加载文件的情况下将文本添加到行尾

时间:2014-12-16 15:09:14

标签: python

我需要以很多字典的形式将信息存储到一个非常大的文件中。这不是那么重要,只是说我试图首先将所有数据都输入这些词典中,但我的内存耗尽(~60Gb)。

很好,所以我想在文件中添加数据,而不是实际将其加载到内存中,通过在行上进行循环并在每行上附加一些文本。那可能吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:5)

你自己尝试过任何代码,你的发现是什么?您可以采用以下方法:

with open('/tmp/bigfile.new', 'w') as output:
    with open('/tmp/bigfile', 'r') as input:
        while True:
            line = input.readline().strip()
            if not line:
                break
            line += ' Look ma, no hands!'
            print(line, file=output)

当然,除了“看不用手”之外你还有额外的字典; - )

答案 1 :(得分:1)

我建议使用泡菜使过程更容易。使用pickle不需要从行中解析dict。而且您可以做的不仅仅是添加数据,您可以更新它并将其删除。

import pickle


def update_dump_dict(dumps, key, value):
    dict_reborn = pickle.loads(dumps)
    dict_reborn[key] = value
    dumps = pickle.dumps(dict_reborn)
    return dumps


def update_line(line_number, key, value):
    with open('datafile.db', 'wb') as output:
        with open('new_datafile.db', 'rb') as input:
            line_number -= 1
            entry = input.readline() 
            if line_number == 0: 
                entry = update_dump_dict(entry, key, value)
            print(entry, file=output)

使用泡菜的例子:

>>> # Dump a dict
>>> some_dict = {1: "Hello"}
>>> dumped_dict = pickle.dumps(some_dict)
>>> print(dumped_dict)
b'\x80\x03}q\x00K\x01X\x05\x00\x00\x00Helloq\x01s.'

>>> # Load the dict.
>>> dict_reborn = pickle.loads(dumped_dict)
>>> print(dict_reborn[1])
Hello

人类可读性怎么样?

为了在文件中保持人类可读性,您可以使用模块json

import json

>>> # Dump a dict
>>> some_dict = {"key": "Hello"}
>>> dumped_dict = json.dumps(some_dict)
>>> print(dumped_dict)
{"key": "Hello"}

>>> # Load the dict.
>>> dict_reborn = json.loads(dumped_dict)
>>> print(dict_reborn["key"])
Hello

当然,以前的版本具有优势,您从文件中读取时不必担心类型。

尽管在已恢复的字典中(使用json.loads),所有字符串(键和值)总是比解析该行以从中提取数据更加容易。