Python在相同的文本文件上返回不同的结果
我是编程新手。我正在使用powershell以文本文件的形式从远程服务器的Windows安全事件日志中筛选和返回记录。我正在使用python脚本计算用户名在文本中出现的次数。在对原始文本文件运行时,python打印并清空字典{}。但是,如果复制文本文件的内容并将其粘贴到新的文本文件中并对其运行python脚本,它将返回正确的计数:Python在相同的文本文件上返回不同的结果,python,powershell,python-unicode,Python,Powershell,Python Unicode,我是编程新手。我正在使用powershell以文本文件的形式从远程服务器的Windows安全事件日志中筛选和返回记录。我正在使用python脚本计算用户名在文本中出现的次数。在对原始文本文件运行时,python打印并清空字典{}。但是,如果复制文本文件的内容并将其粘贴到新的文本文件中并对其运行python脚本,它将返回正确的计数:{'name1':2'name2':13,'name3':1,'name4':1,'name5':2,'name6':2}。文本文件看起来相同,字符位置也相同。有什么问
{'name1':2'name2':13,'name3':1,'name4':1,'name5':2,'name6':2}
。文本文件看起来相同,字符位置也相同。有什么问题吗
动力壳
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"
蟒蛇
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
答案就在你的问题陈述中。您正在读取一个在MS Windows上创建的文件,其中一个python程序运行在(可能是)非Windows系统上
问题是原始文件的字符编码与python程序期望的不匹配。具体来说,原始文件采用UCS-2(或UTF-16)编码。如果您在类UNIX操作系统上运行python代码,则可能需要UTF-8。但这取决于您的语言环境,请查看
locale
的输出。谷歌“PythonUTF-16解码”的想法如何处理这一点。尽管就个人而言,我并没有试图让python程序处理UTF-16,而是试图找到一种在Windows系统上将内容转换为UTF-8的方法。复制粘贴文件内容时,可能会出现制表符/空格转换问题?您能否尝试第行中的条件“帐户名”?嗨,Yakym,问题在于powershell输出的原始文件。当我对它运行python脚本时,它返回一个空字典,只有两个括号{}。但是,当我将内容复制并粘贴到新的文本文件中并对其运行python脚本时,它会返回正确的键和值。但是,出于我的目的,我需要它来处理原始文件或创建一个变通方法。然而,我确实尝试了你的建议,得到了一些有趣的结果,可能会让我更接近答案。输出示例:{“ÿþ”:1,“\x00”:5867,“\x00M\x00e\x00s\x00s\x00a\x00g\x00e\x00”:21,这个答案解决了我的问题。尽管我在Windows 10系统上同时运行powershell和python,但通过在powershell脚本末尾添加-encoding utf8,python脚本成功地针对文本文件运行。