【问题标题】:Writing out text with double double quotes - Python on Linux用双双引号写出文本 - Linux 上的 Python
【发布时间】:2017-01-11 16:02:58
【问题描述】:

我正在尝试将查询的文本输出带到 SSD(提取日志页面,类似于提取 SMART 数据。然后我尝试将这些文本数据从我定期更新的日志文件中写入。

当某些驱动器的日志数据有双双引号作为空白字段的占位符时,就会出现我的问题。这是输入的sn-p:

版本 0x10200
VID 0x15b7
BoardRev 0x0
BootLoadRev ""

当它被写出(附加)到我自己的日志文件时,文本被几个空字符替换,然后当我尝试打开所有文本编辑器时告诉我它已损坏。

"" 字符在我的 Linux 系统上被替换为这样的内容:

BootLoadRev "\00\00\00\00"

使用 \00 字符时,某些字段甚至更长。如果 "" 不存在,说明一切正常。

代码类似这样:

f=open(fileName, 'w')
test_bench.send_command('get_log_page')
identify_data = test_bench.get_data_in()
f.write(identify_data)
f.close()

有没有办法将此文本发送到没有这些空值导致问题的文件?

【问题讨论】:

  • 请包含一个exact 复制器——解决这个问题意味着详细了解问题所在。 (例如,如果您的数据是 UTF-32 编码的,这将导致每个字符前有 三个 NUL;如果您只是从数据源获取文字 NUL,则还有另一个可能的来源,&c) .事实上,没有足够的信息来准确和确定地确定直接原因。
  • 如果您从 Python 登录 repr(identify_data),顺便说一句,这将是一个开始的地方。
  • ...很清楚,这里怀疑的是test_bench 中的代码。您似乎已经得出“引用导致 NUL”的结论,但没有支持这种信念 - “引号围绕字符串,并且来自此来源的字符串包含 NUL”同样可能。因为当 NUL 直接发送到终端时不会呈现 NUL(由于历史原因 - 当终端是从串行线路读取数据的硬件时,您可以在该串行线路上发送 NUL 来告诉它不要做任何事情,并且可以依靠 NUL 占用串行线路以进行计时所需的时间 [...]
  • [...] 目的),如果您通常只是直接打印您的 test_bench 内容,您可能根本不知道 NUL 的存在(尽管它们总是在那里,即使 渲染到文件),因为您的终端没有渲染它们。
  • 无论如何:如果没有test_bench,您无法提供重现此问题的重现器,那么您已经证明在Python 中编写字符串不是问题,而是test_bench 的问题。这种通过确定重现问题所需的内容来确定问题范围的机会是我们制定政策要求本网站上的问题有Minimal, Complete, Verifiable Example 的部分原因。

标签: python linux string text


【解决方案1】:

假设这是 Python 2(因此您的内容就是 Python 3 所称的字节串),并且您的预期数据格式是原始 ASCII,那么简单的解决方案就是在您编写之前从您的内容中删除 NUL到磁盘:

f.write(identify_data.replace('\0', ''))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2019-11-29
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多