Как мне ждать, пока текстовый файл будет записан, построчно прочитать изменения и распечатать? - PullRequest
0 голосов
/ 18 апреля 2020

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

Программа: Random_Generation

import os
import sys
import string
import random
import time

class RandomCreation():
    def __init__(self, path):
        self.path = path

    def string_generator(self, size):
        chars = string.ascii_uppercase + string.ascii_lowercase
        return ''.join(random.choice(chars) for _ in range(size))

if __name__ == '__main__':
    path = os.path.realpath(sys.argv[1])
    try:
        while True:
            random_cration = RandomCreation(path)
            data = random_cration.string_generator(10)
            f = open(f'{path}/try_file.txt', 'a+')
            f.write(data +"\n")
            print('Successfully Appended')
            time.sleep(2)
    except KeyboardInterrupt:
        f.close()
        print('Exiting......')
        exit()

Эта программа работает отлично.

Я хочу написать другую программу (называемую File_Handling), которая откроет тот же файл .text и прочитает файл построчно. Эта программа зависит от вышеупомянутой программы с именем Random_Generation. Эта программа File_Handling будет ждать, пока не будет сгенерирован текстовый файл. После генерации текстового файла он будет построчно читать файл и печатать его содержимое, пока он все еще записывается программой Random_Generation. Если нет новой строки для чтения, она будет ждать новой строки, но сама не останавливается. Поэтому, когда появятся новые строки, я хотел бы напечатать только новые строки.

Программа: File_Handling

import sys
import os
import os.path
import time

path = os.path.realpath(sys.argv[1])
filename = f'{path}/try_file.txt'
while not os.path.exists(filename):
    time.sleep(1)
if os.path.exists(filename):
    file = open(filename, "r")
    for num, line in enumerate(file, 1):
        print(f'{num}: {line}')
    file.close()

Оба кода работают параллельно. Условие программы File_Handling:

  • Если текстовый файл пуст, тогда он будет ожидать появления новой строки
  • Если в текстовом файле есть какие-то строки, он будет читать эти строки построчно до конца файла.
  • Достигнув конца файла, он будет ожидать появления новой строки.
  • Он никогда не возвращается к тем строкам, которые были прочитаны ранее.
  • Программа записи и чтения не синхронизирована.
  • Может быть записано в любой момент времени.
  • Единственный факт, что после чтения записи произойдет до конца файла.

Для достижения цель, он обязательно хочет семафор и, возможно, асин c. Но я должен включить их?

Я не могу сделать так, как требуется в программе File_Handling, пожалуйста, помогите !!!

...