当前位置: 首页 > 知识库问答 >
问题:

在python中使用线程时如何保持文件写入顺序

丌官招
2023-03-14

我有一些python代码来读取文件并将数据推送到列表中。然后把这个列表放到队列中,用线程处理这个列表,比如说一次20个项目。处理后,我将结果保存到一个新文件中。新文件中的内容实际上与原始文件的顺序不同。例如,我有输入,

    1    a
    2    b
    3    c
    4    a
    5    d

但是输出看起来像:

    2    aa
    1    ba
    4    aa
    5    da
    3    ca

有没有办法保持原来的秩序?这是我的代码:


    import threading,Queue,time,sys
    class eSS(threading.Thread):
        def __init__(self,queue):
            threading.Thread.__init__(self)
            self.queue = queue
            self.lock = threading.Lock()
        def ess(self,email,code,suggested,comment,reason,dlx_score):
            #do something
        def run(self):
            while True:
                info = self.queue.get()
                infolist = info.split('\t')
                email = infolist[1]
                code = infolist[2]
                suggested = infolist[3]
                comment = infolist[4]
                reason = infolist[5]
                dlx_score = (0 if infolist[6] == 'NULL' else int(infolist[6]))
                g.write(info + '\t' + self.ess(email,code,suggested,comment,reason,dlx_score) +'\r\n')
                self.queue.task_done()

    if __name__ == "__main__":
        queue = Queue.Queue()
        filename = sys.argv[1]
        #Define number of threads
        threads = 20
        f = open(filename,'r')
        g = open(filename+'.eSS','w')
        lines = f.read().splitlines()
        f.close()
        start = time.time()
        for i in range(threads):
            t = eSS(queue)
            t.setDaemon(True)
            t.start()
        for line in lines:
            queue.put(line)     
        queue.join()
        print time.time()-start
        g.close()

共有1个答案

师建德
2023-03-14

我想到了三个想法。所有的共同点是在排队等待处理的数据包中包含一个索引。

  • 一种想法是使用控制器/工人/输出框架,其中输出线程将工人处理的数据解队列、组装并输出。
  • 第二个想法是使用内存映射文件作为输出,并使用索引来计算写入文件的偏移量(假设可能是固定长度的写入)。
  • 第三种是使用索引将处理过的数据放入一个新列表中,当列表完成时,在末尾而不是动态地写入项目。
 类似资料:
  • 问题内容: 我如何将分数写入文件? 问题答案: 您可以手动打开和关闭文件,但最好使用它,因为它可以为您处理关闭文件。 表示追加到文件中,该文件不会覆盖以前的内容- 这可能是您想要的。据我所知,您将要在print语句之后或之前添加它。如果您不懂读写文件,则应查看此链接。

  • 问题内容: 我想将一个键,值对添加到哈希表(或任何其他集合)中,但必须保持插入顺序。我怎样才能做到这一点? 就像我将1作为键“ 1”添加为值,将2作为键并将“ 2”添加为值。 输出应为: 问题答案: 以下是一些重要实现的特征差异: :“具有可预测的迭代顺序,通常是将键插入映射 的顺序 ( 插入顺序 )。” :“不保证地图的顺序” :“根据其键的自然顺序或按” 即是一个 因此,在这种情况下,您需要的

  • 问题内容: 我正在尝试使用多个线程在Java中编写一个大文件。 我已经尝试了Java 和类。 实际上,要写入的内容是使用和写入的整个表(Postgres)。文件中的每一行都是表中的一个元组,我一次要写100行。 编写方法: 单个待写入文件由附加模式下的多个线程打开。此后,每个线程都尝试写入文件文件。 以下是我面临的问题: 有时,文件的内容将被覆盖,即:一行仍然不完整,而下一行从那里开始。我的假设是

  • 我目前正在为我们的服务器编写自动备份脚本。我正在使用脚本中的UNIX tar命令来存档代码存储库。 在我的PERL脚本中,我使用tar命令如下: 我想在提取tar存档文件时保留文件所有权。我试图用以下命令列出tar归档文件的内容 并且该列表包含每个文件的正确文件所有权,但在提取存档时,文件所有权更改为当前用户。 有没有办法提取一个tar归档文件,并保留每个文件的原始文件所有权?

  • 问题内容: 我遇到一种情况,我想将我创建的所有日志写入文本文件。 我们正在使用java.util.logging.Logger API生成日志。 我试过了: 但是仍然只能在控制台上获取我的日志。 问题答案: 试试这个样本。这个对我有用。 在MyLogFile.log产生输出 编辑: 要删除控制台处理程序,请使用 因为ConsoleHandler已向父记录器注册,所有记录器都源自该记录器。

  • 问题内容: 我试图了解Python中的线程。我看过文档和示例,但坦率地说,许多示例过于复杂,我难以理解它们。 你如何清楚地显示为多线程而划分的任务? 问题答案: 我将在下面进行总结-最终仅是几行代码: 这是以下内容的多线程版本: 描述 Map是一个很棒的小功能,是轻松将并行性注入Python代码的关键。对于那些不熟悉的人来说,地图是从Lisp等功能语言中提炼出来的。它是将另一个功能映射到序列上的功