Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

Чтение файла, если он занят?

#python #python_3x #python_35


Подскажите, может есть более правильный способ чтения файла?

Я написал функцию для чтения файла, как только этот файл появляется в указанной папке.
Но часто случается, что файл еще не сформировался до конца, а мой скрипт уже пытается
его прочесть и выпадает в ошибку. Чтобы избежать ошибки чтения я делаю бесконечный
цикл и использую try.

Я вот нутром чувствую, что делаю какой-то костыль и наверное есть правильный способ
решения такой задачи. Знаете ли вы более правильный способ чтения файла?

def read_file(filename, **csvparms):
    """Считываем данные из файла и превращаем их в список
        Выбираем из файла всё сождержимое, превращаем все в список
        возвращаем все, кроме первой строки, поскольку там заголовки
        Пример использования:
            table = read_file('filename.csv', delimiter=';')
    """
    while True:
        try:
            with open(os.path.join(filename)) as f:
                table = list(csv.reader(f, **csvparms))
                print('Открыл файл', repr_select)
                # repr_select = sum(1 for line in table)-1 #количество строк в файле
                return table[1:]
            break
        except:
            print('Не получилось открыть файл', filename)

    


Ответы

Ответ 1



Если знать характер смены значения даты "последнего изменения файла", то от этого можно оттолкнуться, например: если дата изменений не менялась 10 секунд, то можно приступать к манипуляциям с файлом: import os import time p1 = "./script46.py" while True: df = os.path.getmtime(p1) dn = time.time() if (dn - df) > 10: print "Editing time - {0}, now - {1}. Lets read file.".format(df, dn) break time.sleep(1) print "." # . # . # . # Editing time - 1544082490.01, now - 1544082500.22. Lets read file.

Ответ 2



os.stat - status of a file : os.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026, st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295, st_mtime=1297230027, st_ctime=1297230027) import os, csv, time, contextlib def read_file(filename='asADS1.py', wait=.5, **csvparms): """если за период wait сек. os.stat файла не изменился - читать файл""" ff = os.path.join(filename) new = os.stat(ff) while True: (old, new) = (new, os.stat(ff)) if new == old: with contextlib.suppress(Exception), open(ff) as f: return list(csv.reader(f, **csvparms))[1:] time.sleep(wait) continue return

Ответ 3



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

Комментариев нет:

Отправить комментарий