سؤال

لقد خلق بيثون السيناريو الذي يسحب البيانات من أوله تيارات في مستندات Word ، ولكن أواجه مشكلة في تحويل OLE2-تنسيق الطابع الزمني إلى شيء أكثر الإنسان للقراءة :(

الزمني الذي انسحب هو 12760233021 ولكن لا حياة لي تحويل هذا إلى تاريخ 12 Mar 2007 أو ما شابه ذلك.

أي مساعدة هي موضع تقدير كبير.

تحرير:حسنا يجب تشغيل البرنامج النصي على أحد مستندات word التي تم إنشاؤها على 31/10/2009, 10:05:00.إنشاء موعد في أوله DocumentSummaryInformation ستريم 12901417500.

مثال آخر هو كلمة دكتور التي تم إنشاؤها على 27/10/2009, 15:33:00 ، ويعطي خلق تاريخ 12901091580 في أوله DocumentSummaryInformation تيار.

وثائق MSDN على خصائص هذه OLE تيارات http://msdn.microsoft.com/en-us/library/aa380376%28VS.85%29.aspx

على مواطنه والتي تسحب هذه التيارات هو أدناه:

import OleFileIO_PL as ole

def enumerateStreams(item):
    # item is an arbitrary file
    if ole.isOleFile('%s' % item):
        loader = ole.OleFileIO('%s' % item)
        # enumerate all the OLE streams in the office file
        streams = loader.listdir()
        streamProps = []
        for stream in streams:
            if stream[0] == '\x05SummaryInformation':
                # get all the properties fro the SummaryInformation OLE stream
                streamProps.append(loader.getproperties(stream))
            elif stream[0] == '\x05DocumentSummaryInformation':
                # get all the properties from the DocumentSummaryInformation stream
                streamProps.append(loader.getproperties(stream))
     return streamProps
هل كانت مفيدة؟

المحلول

(0) الرجاء توضيح "12 Mar 2007 أو ما شابه":هل يعني أن تتوقع 11-أرقام الباحث إلى تحويل إلى 12 Mar 2007, أو هو "12 Mar 2007" يقصد مجرد أنقل الشكل الذي تريد عرض التاريخ ؟ إذا كان هذا الأخير, لا يمكنك أن توفر النتائج المتوقعة من خلال فحص بعض الملفات مع MS Word أو OpenOffice.org's معالجة النصوص الأداة ؟ كيف تنوي التحقق من أن أي حل التي يتم تقديمها في الواقع يعمل ؟

(1) يرجى إعطاء أكثر من واحد (OLE المتوقع) الزوج بحيث الصحيح تشغيل أي من الحلول المقترحة يمكن التحقق مع المزيد من الاطمئنان.إذا كان ذلك ممكنا ، يمكنك إنشاء الأمثلة المعروفة القيم المتوقعة مثل 01 يناير 2000, 01 Jan 2001, 02 Jan 2001, 02 فبراير عام 2001 ؟

(2) فإنه ليس من الواضح من "تسحب البيانات من أوله تيارات" ما إذا كنت تريد إنشاء ملف الخ الطوابع الزمنية في OLE2 مجمع الوثيقة رأس ، أو ما إذا كنت تريد الطوابع الزمنية التي تكون موجودة في المحتوى.يرجى أقول أين أنت تصطاد الطوابع الزمنية.ومن شأنه أيضا أن يساعد كثيرا إذا كنت يمكن أن يعطي إشارة إلى MS الوثائق التي تتعلق الطوابع كنت مهتما في ...بالتأكيد يجب أن أقول لك ما هو الشكل ، حتى لو كان ذلك بشكل غير مباشر عن طريق واحد أو اثنين داخل/خارج الوثيقة القفزات.

(3) يرجى إظهار كيف يتم سحب هذا -- هو سلسلة ؟ ثابت 11 بايت?أو هو str(بعض الباحث أن لديك تحويلها من 64 بت)?تحويلها كيف??وكذلك وصف تظهر شفرة التحويل.لا إعادة كتابة التعليمات البرمجية من الذاكرة ؛ استخدام نسخ/لصق.

يرجى تقديم المعلومات المطلوبة عن طريق تحرير سؤالك, لا تعليقات.

تحديث في انتظار معلومات:

ملف إنشاء وتعديل الطوابع الزمنية في أوله مجمع المستند يبدو 64 بت endian طفيف تمثل الأعداد الصحيحة (ثانية منذ 1601-01-01T00:00:00) * 10 ** 7.

تاريخ النوع المستخدم في البيانات في OLE2 تظهر البيانات 64-بت endian طفيف IEEE 754 تطفو تمثل (أيام جزء منها) منذ 1899-12-30T00:00:00.نعم اليوم هو 30 ، وليس 31.

تحديث بعد فحص 2 الأمثلة الموردة:

الفرق بين الاثنين لوحظ الطوابع الزمنية (التي سيتم بالتوقيت المحلي الخاص بك) هو 325920 ثانية:

>>> import datetime
>>> t0 = datetime.datetime(2009,10,27,15,33,0)
>>> t1 = datetime.datetime(2009,10,31,10,5,0)
>>> t1-t0
datetime.timedelta(3, 66720)
>>> secs = 3 * 24 * 60 * 60 + 66720
>>> secs
325920

هذا هو نفس الفرق بين الأرقام السحرية:

>>> 12901417500 - 1290191580
325920

وبالتالي فإن الأرقام السحرية تمثل الثواني منذ بعض الحقبة ...

>>> m1 = 12901417500
>>> days, seconds = divmod(m1, 60*60*24)
>>> epoch = t1 - datetime.timedelta(days, seconds)
>>> epoch
datetime.datetime(1601, 1, 1, 11, 0)

وبالتالي فإن الأرقام السحرية تمثل الثواني منذ 1601-01-01T00:00:00Z و TZ هو 11 ساعات عن التوقيت العالمي.

هذين الأرقام السحرية لا يصلح في 32 بت ...يبدو إما (أ) يتم تخزينها في 64 بت ثانية منذ 1601 (مضيعة حوالي 29 بت!) أو (ب) تخزين (عدد 100 نانوثانية الوحدات) منذ 1601 كما هو متوقع ولكن شيئا ما تقسيمه بنسبة 10**7 قبل أن ترى ذلك.

الوثائق المرجعية التي أعطيتها مجرد يقول أنه VF_FILETIME (UTC) نوع.غوغلينغ أن أجد بضع MS القرائن على استدعاء وظائف ويندوز التعامل مع الطوابع الزمنية ، ولكن لا يوجد تعريف بقدر ما بدا لي.ومع ذلك هناك نوعان 3rd الطرف (من perlmonks و Apache POI المشروع) الذي يقول الكثير من الشيء نفسه:"""هذا يبدو مثل ويندوز VT_FILETIME نوع البيانات الذي هو 64 بت غير موقعة عدد صحيح يمثل عدد المنقضي 100 نانو ثانية منذ 1 كانون الثاني / يناير 1601"""

تحديث من موقع الجريمة:

يبدو أنك تستخدم OleFileIO_PL لقراءة الملفات.سريع نقب من خلال المصدر الوحيد الملف يكشف هذا:

    elif type == VT_FILETIME:
        value = long(i32(s, offset+4)) + (long(i32(s, offset+8))<<32)
        # FIXME: this is a 64-bit int: "number of 100ns periods
        # since Jan 1,1601".  Should map this to Python time
        value = value / 10000000L # seconds

نصائح أخرى

هذا السؤال قديم جدا ولكن لا تزال مفيدة.لقد تحسنت مؤخرا OleFileIO_PL إلى حل المشكلة عن طريق تحويل التواريخ تلقائيا إلى الثعبان التاريخ والوقت.

راجع الوثائق في هذه الصفحة خصوصا الأجزاء عن get_metadata و get_properties:https://bitbucket.org/decalage/olefileio_pl

عند استخدام get_metadata جميع الطوابع الزمنية في معيار الملكية تيارات مثل '\x05SummaryInformation' يتم تحويلها إلى الثعبان التاريخ والوقت.إذا كنت بحاجة إلى استخدام get_properties بدلا من ذلك ، ثم استخدام convert_time الخيار:

p = ole.getproperties('specialprops', convert_time=True)

فيليب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top