python - 在 python 和 linux shell 中处理(二进制?)文件

标签 python file text character-encoding utf-16

我最近用 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/

相关文章:

Python:列表理解和函数式编程

python - cv2 和 BGR2YCrCb 不适用于 Python 绑定(bind)

python - 如何更改 seaborn 联合图中的十六进制大小? (六边形本身,而不是垃圾箱)

python - 如何让selenium不等待页面加载一次?

C - 在函数参数中声明一个文件

html - 在 HTML Canvas 中添加字母间距

python - 文本文件中的克里特岛单词列表

c - 在 Linux 上获取文件选择器的简单方法

JavaScript 正则表达式,其中没有两个符号一个接一个地出现并且至少存在一个这样的符号

C++ getline 读取整个文件