Python возвращает разные результаты для одинаковых текстовых файлов - PullRequest
0 голосов
/ 21 мая 2018

Я новичок в программировании.Я использую PowerShell для фильтрации и возврата записей из журнала событий безопасности Windows на удаленном сервере в текстовом файле.Я использую скрипт Python, чтобы подсчитать, сколько раз имена пользователей появляются в тексте.При работе с исходным текстовым файлом, Python печатает и пустой словарь {}.Но, если я скопирую содержимое текстового файла и вставлю его в новый текстовый файл и запустю свой скрипт на python для него, он вернёт правильный счет: {'name1': 2, 'name2': 13, 'name3': 1, 'name4': 1, 'name5': 2, 'name6': 2}.Текстовые файлы выглядят одинаково, а позиции символов идентичны.В чем может быть проблема?

Powershell

Get-WinEvent -LogName "Security" -ComputerName server01 | Where-Object {$_.ID -eq 4663} | where Message -CNotLike "*name1*" | where Message -CNotLike "*name2*" | Format-List -Property * | Out-File "C:\apowershell\winsec\events.txt"

Python

fhand = open('events2.txt')
counts = dict()
for line in fhand:
    if line.startswith('            Account Name:'):
        words = line.split()
        words.remove('Account')
        words.remove('Name:')
        for word in words:
            if word not in counts:
               counts[word] = 1
            else:
               counts[word] += 1
print(counts)

Запись журнала Сообщение: была сделана попытка доступа к объекту.

      Subject:
        Security ID:        S-1-5-21-495698755-754321212-623647154-4521
        Account Name:       name1
        Account Domain:     companydomain
        Logon ID:       0x8CB9C5024

      Object:
        Object Server:      Security
        Object Type:        File
        Object Name:        e:\share\file.txt
        Handle ID:      0x439c
        Resource Attributes:    S:PAI

      Process Information:
        Process ID:     0x2de8
        Process Name:       C:\Windows\System32\memshell.exe

      Access Request Information:
        Accesses:       Execute/Traverse

        Access Mask:        0x20

1 Ответ

0 голосов
/ 22 мая 2018

Ответ в вашей постановке задачи.Вы читаете файл, созданный в MS Windows с помощью программы на Python, работающей в (предположительно) системе, отличной от Windows.

Проблема заключается в том, что кодировка символов исходного файла не соответствует ожидаемой программе Python,В частности, исходный файл находится в кодировке UCS-2 (или UTF-16).Если вы выполняете свой код на Python в UNIX-подобной ОС, он, вероятно, ожидает UTF-8.Но это зависит от вашей локали, посмотрите на вывод locale.Google "python utf-16 decode" для идей о том, как с этим бороться.Хотя лично я вместо того, чтобы пытаться заставить вашу программу на Python обрабатывать UTF-16, я пытаюсь найти способ конвертировать контент в UTF-8 в системе Windows.

...