Чтение имен файлов csv из папки и получение даты и времени созданного файла [дубликат]

Я попробовал все перечисленные выше решения, но ничего не получилось. Это то, что сработало для меня.

  1. Посмотрите полное сообщение об ошибке, которое вы получаете при использовании библиотеки (ggplot2).
  2. В нем перечислены несколько пакетов, которые отсутствуют или имеют ошибки.
  3. Удалите и переустановите их.
  4. ggplot теперь должен работать с предупреждением для версии.
722
задан Mark Biek 25 October 2008 в 22:54
поделиться

11 ответов

Получение какой-либо даты модификации кросс-платформенным способом легко - просто вызовите os.path.getmtime(path) , и вы получите отметку времени Unix, когда последний файл в path был последним изменен.

Получение дат создания файла , с другой стороны, неудобно и зависит от платформы, различающееся даже между тремя большими ОС:

  • Вкл. Windows, файл ctime файла (задокументированный в https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) сохраняет дату создания. Вы можете получить доступ к этому в Python через os.path.getctime() или атрибут .st_ctime результата вызова os.stat() . Этот не будет работать в Unix, где ctime - последний раз, когда атрибуты или содержимое файла были изменены .
  • На Mac, а также некоторые другие ОС на базе Unix, вы можете использовать атрибут .st_birthtime результата вызова os.stat().
  • В Linux это невозможно в настоящее время , по крайней мере, без написания расширения C для Python. Хотя некоторые файловые системы, обычно используемые с Linux , создают даты создания хранилища (например, ext4 хранит их в st_crtime), ядро ​​Linux не имеет доступа к ним ; в частности, структуры, которые он возвращает из вызовов stat() в C, начиная с последней версии ядра, не содержат полей даты создания . Вы также можете видеть, что идентификатор st_crtime в настоящее время не присутствует нигде в источнике Python . По крайней мере, если вы находитесь на ext4, данные - , прикрепленные к inodes в файловой системе, но нет удобного способа доступа к нему. Следующей лучшей идеей в Linux является доступ к файлу mtime с помощью либо os.path.getmtime() , либо атрибута .st_mtime результата os.stat(). Это даст вам последний раз, когда содержимое файла было изменено, что может быть подходящим для некоторых случаев использования.

Положив все это вместе, межплатформенный код должен выглядеть примерно так ...

import os
import platform

def creation_date(path_to_file):
    """
    Try to get the date that a file was created, falling back to when it was
    last modified if that isn't possible.
    See http://stackoverflow.com/a/39501288/1709587 for explanation.
    """
    if platform.system() == 'Windows':
        return os.path.getctime(path_to_file)
    else:
        stat = os.stat(path_to_file)
        try:
            return stat.st_birthtime
        except AttributeError:
            # We're probably on Linux. No easy way to get creation dates here,
            # so we'll settle for when its content was last modified.
            return stat.st_mtime
321
ответ дан igracia 18 August 2018 в 07:33
поделиться
  • 1
    Я сделал все возможное, чтобы бросить это вместе (и потратил несколько часов на исследование в процессе), и я уверен, что это, по крайней мере, более корректно , чем ответы, которые были здесь ранее, но это a действительно трудно , и я был бы признателен за любые исправления, разъяснения или другие материалы, которые могут предложить люди. В частности, я хотел бы построить способ доступа к этим данным на дисках ext4 в Linux, и я хотел бы узнать, что происходит, когда Linux читает файлы, написанные Windows, или наоборот, учитывая, что они используют st_ctime иначе. – Mark Amery 14 September 2016 в 23:59
  • 2
    Честно говоря, время создания файла обычно бесполезно. Когда вы открываете существующий файл для записи в режиме "w", он не заменяет его, он просто открывает существующий файл и обрезает его. Несмотря на то, что содержимое файла полностью не связано с тем, что было при создании, вам все равно будет сказано, что файл был «создан». задолго до текущей версии. И наоборот, редакторы, использующие атомарную замену в save (исходный файл заменяется новым временным файлом temp), показывают более новую дату создания, даже если вы просто удалили один символ. Используйте время модификации, не тратьте время на создание. – ShadowRanger 17 October 2016 в 14:00
  • 3
    После многих лет я наконец нашел применение для создания файла! Я пишу код для проверки соглашения об именах файлов в определенных каталогах, поэтому прежде всего я хочу рассмотреть файлы, которые были сначала названы после того, как было принято соглашение. Замена всего содержимого (mtime) не имеет значения: если он уже был там, значит, он встал. – Steve Jessop 3 December 2016 в 16:01
  • 4
    Привет Марк. Я предлагаю упрощение. В Linux возвращение stat.st_ctime более уместно, потому что во многих случаях время последнего изменения метаданных может быть временем создания (по крайней мере ctime ближе к реальное время создания , чем mtime). Поэтому вы можете просто заменить свой фрагмент на stat = os.stat(path_to_file); try: return stat.st_birthtime; except AttributeError: return stat.st_ctime. Как вы думаете? ура – olibre 7 August 2017 в 15:31
  • 5
    @olibre "по меньшей мере ctime ближе к реальному времени создания, чем mtime & quot; - нет, это не так; это то, что я видел несколько раз, но это абсолютно ложно. Если вы вручную не испортили значения в вашем inode, ctime всегда должны быть равны или позже , чем mtime, потому что изменение mtime вызывает a ctime изменяется (поскольку сам mtime рассматривается как «метаданные»). См. stackoverflow.com/a/39521489/1709587 , где я приводим примерный код, чтобы проиллюстрировать это. – Mark Amery 9 August 2017 в 11:08

Лучшей функцией для этого является os.path.getmtime () . Внутри это просто использует os.stat(filename).st_mtime.

Модуль datetime - лучший способ создания временных меток, поэтому вы можете получить дату модификации как объект datetime следующим образом:

import os
import datetime
def modification_date(filename):
    t = os.path.getmtime(filename)
    return datetime.datetime.fromtimestamp(t)

Пример использования:

>>> d = modification_date('/var/log/syslog')
>>> print d
2009-10-06 10:50:01
>>> print repr(d)
datetime.datetime(2009, 10, 6, 10, 50, 1)
341
ответ дан Christian Oudard 18 August 2018 в 07:33
поделиться
  • 1
    Этот ответ также немного ошибочен. getmtime - ближайшая вещь, доступная в Unix (где получение дат создания невозможно), но определенно не самая лучшая функция для использования в Windows, где ctime - время создания. – Mark Amery 12 September 2016 в 20:00
  • 2
    @MarkAmery - этот ответ четко обозначается как просто время модификации. – ArtOfWarfare 19 January 2017 в 19:30

Есть два способа получить время мода, os.path.getmtime () или os.stat (), но ctime не является надежной кросс-платформенной (см. ниже).

os.path.getmtime ()

getmtime ( путь ) Возвращает время последней модификации пути. Возвращаемое значение - это число, указывающее количество секунд с момента (см. Модуль времени). Поднимите os.error, если файл не существует или недоступен. Новое в версии 1.5.2. Изменено в версии 2.3: Если os.stat_float_times () возвращает True, результатом будет число с плавающей запятой.

os.stat ()

stat ( путь ) Выполните системный вызов stat () по данному пути. Возвращаемое значение - это объект, атрибуты которого соответствуют членам структуры stat, а именно: st_mode (бит защиты), st_ino (номер inode), st_dev (устройство), st_nlink (количество жестких ссылок), st_uid (идентификатор пользователя владельца ), st_gid (идентификатор группы владельца), st_size (размер файла, в байтах), st_atime (время последнего доступа), st_mtime (время последней модификации контента), st_ctime (зависит от платформы, время изменения последних метаданных в Unix или время создания в Windows) :

>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
(33188, 422511L, 769L, 1, 1032, 100, 926L, 1105022698,1105022732, 1105022732)
>>> statinfo.st_size
926L
>>> 

В приведенном выше примере вы должны использовать statinfo.st_mtime или statinfo.st_ctime для получения mtime и ctime соответственно.

35
ответ дан Jay 18 August 2018 в 07:33
поделиться

Я смог получить время создания в posix, запустив команду stat и выведя результат.

commands.getoutput('stat FILENAME').split('\"')[7]

Вернул стат вне python из терминала (OS X):

805306374 3382786932 -rwx------ 1 km staff 0 1098083 "Aug 29 12:02:05 2013" "Aug 29 12:02:05 2013" "Aug 29 12:02:20 2013" "Aug 27 12:35:28 2013" 61440 2150 0 testfile.txt

... где четвертое datetime - это создание файла (а не время смены времени, как отмечалось в других комментариях).

-3
ответ дан kmarchand 18 August 2018 в 07:33
поделиться
  • 1
    Не работает в Linux. – Mechanical snail 14 October 2013 в 00:10
  • 2
    -1: Анализ вывода, предназначенного для людей из команды оболочки, является плохой идеей very . И эта команда не является даже кросс-совместимой. – MestreLion 5 November 2013 в 19:29

os.stat https://docs.python.org/2/library/stat.html#module-stat

изменить: в более новом коде вы, вероятно, должны использовать os.path.getmtime () (спасибо Кристиан Оудар), но обратите внимание, что он возвращает значение с плавающей запятой time_t с долей секунд (если ваша ОС поддерживает его)

46
ответ дан kmarsh 18 August 2018 в 07:33
поделиться
  • 1
    os.path.getmtime () сделано для этого и проще. – Christian Oudard 6 October 2009 в 15:52
  • 2
    «В новом коде» предложение здесь немного вводит в заблуждение. os.path.getmtime() существует с Python 1.5.2 (см. старые документы ), выпущенные до того, как я потерял большинство своих детских зубов и почти за десять лет до того, как вы написали оригинальную версию этого ответа. – Mark Amery 12 September 2016 в 19:04

Если следующие символические ссылки не важны, вы также можете использовать встроенный os.lstat.

>>> os.lstat("2048.py")
posix.stat_result(st_mode=33188, st_ino=4172202, st_dev=16777218L, st_nlink=1, st_uid=501, st_gid=20, st_size=2078, st_atime=1423378041, st_mtime=1423377552, st_ctime=1423377553)
>>> os.lstat("2048.py").st_atime
1423378041.0
1
ответ дан Low Kian Seong 18 August 2018 в 07:33
поделиться
  • 1
    Это даст время последнего чтения (по крайней мере, в Unix), которое definately не является тем, о чем просили. – Mark Amery 12 September 2016 в 20:16

os.stat возвращает именованный кортеж с атрибутами st_mtime и st_ctime. Время модификации st_mtime на обеих платформах; к сожалению, в Windows, ctime означает «время создания», тогда как на POSIX это означает «время изменения». Я не знаю, как получить время создания на платформах POSIX.

11
ответ дан Mr_and_Mrs_D 18 August 2018 в 07:33
поделиться

У вас есть несколько вариантов. Для этого вы можете использовать функции os.path.getmtime и os.path.getctime :

import os.path, time
print("last modified: %s" % time.ctime(os.path.getmtime(file)))
print("created: %s" % time.ctime(os.path.getctime(file)))

Другой вариант - использовать os.stat :

import os, time
(mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(file)
print("last modified: %s" % time.ctime(mtime))

Примечание: ctime() указывает, что not относится к времени создания в системах * nix, а скорее в последний раз, когда изменились данные inode. (спасибо kojiro за то, что этот факт более ясен в комментариях, предоставив ссылку на интересный пост в блоге)

611
ответ дан phoenix 18 August 2018 в 07:33
поделиться
  • 1
    На всякий случай, если кто-то пропустит комментарий @ Glyph к вопросу, ctime не означает время создания на POSIX-системах . Интересно, сколько людей сняли этот пост за последние три года и продолжали писать багги-код. – kojiro 7 November 2011 в 22:37
  • 2
    Имейте в виду, что первый пример дает вам строку, а не дату и время. – Gerald Kaszuba 12 July 2013 в 01:53
  • 3
    @kojiro сообщение в блоге, с которым вы связались, может быть более явным, что в Unix файл ctime обновляется всякий раз, когда mtime делает (поскольку mtime является «метаданные»), и поэтому ctime обычно всегда равным или впереди mtime. Обработка ctime как "созданная" время, таким образом, не имеет никакого смысла. -1! – Mark Amery 12 September 2016 в 20:15

os.stat включает время создания. Нет никакого определения st_anything для элемента os.stat(), который содержит время.

Итак, попробуйте это:

os.stat('feedparser.py')[8]

Сравните это с вашим создать дату в файле в ls -lah

Они должны быть одинаковыми.

0
ответ дан Rod 18 August 2018 в 07:33
поделиться
>>> import os
>>> os.stat('feedparser.py').st_mtime
1136961142.0
>>> os.stat('feedparser.py').st_ctime
1222664012.233
>>> 
2
ответ дан unmounted 18 August 2018 в 07:33
поделиться
0
ответ дан Steven C. Howell 30 October 2018 в 02:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: