Проверьте, указывают ли два файловых указателя на один и тот же файл в Python - PullRequest
0 голосов
/ 12 сентября 2018

Как проверить, указывают ли два файловых указателя на один и тот же файл.

>>> fp1 = open("/data/logs/perf.log", "r")
>>> fp1
<open file '/data/logs/perf.log', mode 'r' at 0x7f5adc07cc00>
>>> fp2 = open("/data/logs/perf.log", "r")
>>> fp2
<open file '/data/logs/perf.log', mode 'r' at 0x7f5adc07cd20>
>>> fp1 == fp2
False
>>> fp1 is fp2
False

Мой вариант использования - я наблюдаю за изменениями в файле и что-то делаю, ноlogback переворачивает этот файл на старую дату и создает новый файл.Но переменная указателя файла в python по-прежнему указывает на старый файл.Если fp1 != fp2, я бы хотел обновить fp1 до нового файла.

Почему .name не работает?Когда я пытался,

mv /data/logs/perf.log /data/logs/perfNew.log
echo abctest >> /data/logs/perfNew.log

даже тогда имя все еще старое.

>>> fp1.readline()
'abctest\n'
>>> fp1.name
'/data/logs/perf.log'

1 Ответ

0 голосов
/ 12 сентября 2018

os.fstat доступен в Windows и UNIX и позволяет сравнивать номер индекса (серийный номер файла) и идентификатор устройства , чтобы однозначно идентифицировать файл в системе :

import os
fp1 = open("/data/logs/perf.log", "r")
fp2 = open("/data/logs/perf.log", "r")
stat1 = os.fstat(fp1.fileno())
stat2 = os.fstat(fp2.fileno())

# This comparison tests if the files are the same
stat1.st_ino == stat2.st_ino and stat1.st_dev == stat2.st_dev

fp1.close()
fp2.close()

st_ino - это номер индекса, который уникально идентифицирует файл на диске.Однако один и тот же номер инода может существовать на разных дисках, поэтому st_dev (идентификатор устройства) используется для определения того, на каком диске / диске / устройстве находится файл.

...