我最近用 python 编写了一个脚本,用于处理 Microsoft Windows DHCP 服务器转储文件,并使用电子表格 XML 格式生成当前预订的 XML 文件。
该脚本基本上使用 python open() 命令打开一个文件,然后迭代每一行(文件中的行) 并查找关键字 >保留倾斜。 如果找到关键字,则使用 shlex split() 命令将该行分成多个字段。
但是,当我使用 Microsoft DHCP 服务器的默认转储文件运行此脚本时,我没有得到任何结果。 另请注意,我无法使用 Linux 的 grep 命令在文件中搜索
然后我尝试在 gedit 中打开该文件并将其另存为 unix 文本文件。完成此操作后,我得到了结果并且能够在文件中进行 grep 操作。然而,这种方法违背了编写脚本来自动化我的工作的全部意义。
我一直在谷歌上搜索,但没有找到我想要的东西。我也尝试以二进制模式打开该文件,但这也没有帮助。
我希望有人能帮我解决这个问题。
根据请求,以下是脚本功能(至少是循环部分)和 DHCP 服务器输出的示例:
脚本
# Setup an empty dictionary to store the extracted records
records = {}
# Open dhcp dump file
f = open(dhcp.txt, "r")
# Iterate file line by line
for line in f:
# Only use line with the word "reservedip" in it
if "reservedip" in line:
# Split line into fields by spaces (excluding quoted substrings)
field = shlex.split(line)
# Add new entry for each record using the 32bit IP address int as it's key
records[addr_to_int(field[7])] = [field[7], field[8], field[9], field[10]]
*注意:addr_to_int 是我编写的一个函数,用于将点分 IPv4 地址转换为整数*
DHCP 转储
不幸的是,由于公司政策,我无法包含真正的 DHCP 服务器转储。但我试图从文件中取出的行如下所示:
Dhcp Server \\servername.company.local Scope 172.16.104.0 Add reservedip 172.16.104.207 003386dd00gg "hostname.company.local" "Host Description" "BOTH"
提前致谢, 帕斯卡
最佳答案
文件中这些字符串的编码可能不是 ASCII 兼容的字符编码。 UTF-8 和拉丁语应该兼容,因为它们对 ASCII 字符仅使用一个字节。 UTF-16和 UTF-32 不兼容,它们每个字符总是使用多个字节。 UTF-16 在 MS 文件中并不罕见,有时文件甚至是混合的。
转储可能使用 2 个字节,即使对于 ASCII 字符也是如此。然后你会在文件中包含 r~e~s~e~r~v~e~d~i~p
,其中 ~
是其他字节(也可以是~r
甚至 ~~
仍然编码为 r
。
只是一个疯狂的猜测,因为不允许您发布实际文件,而且我对 MS DHCP 服务器转储一无所知。
什么是
file file.txt
给你?
怎么样
file --mime-type --mime-encoding
如果它是“混合”二进制/字符串文件,它不一定会告诉您编码,但如果它是纯 UTF/ASCII 文本,它应该会告诉您。
关于python - 在 python 和 linux shell 中处理(二进制?)文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13911665/