#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, то программа пишет в лог и завершает работу
Комментариев нет:
Отправить комментарий