Читайте несколько файлов непрерывно и одновременно - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь написать программу, которая непрерывно считывает содержимое текстовых файлов и добавляет содержимое строк в список.

Это выглядит так:

data = []
file_position = 0

while True:
    with open('test.txt', 'r') as f:
        f.seek(file_position) 
        for line in f:
            data.append(int(line))
        file_position = f.tell()

        if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
            line = input()
            break

Последний Оператор if предназначен для выхода из while l oop нажатием клавиши ввода.

Теперь я хочу, чтобы я прочитал другой текстовый файл, скажем test2.txt, также в реальном time и добавьте его строки, чтобы сказать data2 = []. И этот процесс должен происходить одновременно с описанным выше. Таким образом, моя программа должна прочитать строку 1, например, обоих файлов одновременно и добавить ее содержимое в соответствующий список, затем go в строку 2 каждого файла и так далее.

Что будет как это сделать?

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Вы можете попробовать что-то вроде этого:

from threading import Thread

def copy_file_func(in_file_name, out_file_name)
    with open(file_name) as f:
        with open("out.txt", "w") as f1:
            for line in f:
                if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
                    line = input()
                    break
                f1.write(line)

if __name__ == '__main__':
    Thread(target = copy_file_func, kwargs={'in_file_name': 'first.txt', 'out_file_name': 'first_out.txt'}).start()

Но написать это на bash может go быстрее, если это важно для вас

1 голос
/ 12 июля 2020

Я думаю, у вас есть 3 варианта

  1. asyn c IO https://pypi.org/project/aiofile/
  2. потоков и читать каждый файл в другом потоке, тогда, если вы хотите обработать его каким-то образом вы, вероятно, не хотите использовать списки, а deque или Queue
  3. используйте select для чтения из каждого fd, когда он будет готов к чтению, но вам нужно будет что-то сделать с вашим "ждать "введите" для завершения "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...