如何在Python中从文件中读取Ctrl命令字符

3

我现在正在尝试使用Python 2读取和解析文件。文件的创建者在终端中键入了一堆带有(Ctrl A)的行,并将这些行复制到文本文件中。因此,文件中的行看起来像"(something)^A(something)"。当我使用Python中的readlines()函数读取文件时,那些"^A"字符串无法被识别。

我尝试使用io.open和codecs.open,并将编码设置为UTF-8,但"^A"显然不是UTF-8字符串。是否有人知道如何使用Python从文件中读取这些特殊的控制命令字符串?非常感谢!


2
一般来说,在这个网站上鼓励发布你的代码。否则很难建议你哪里出了问题。你需要以二进制读取模式打开文件,读取字节并检查每个字节是否与Ctrl-A的ASCII码匹配(我相信其值为1)。 - RobertB
你知道我该如何在Python中按字节读取并匹配值1吗?使用哪个函数? - Andy Chang
控制字符是不可见的字符,因此终端使用^A作为视觉表示。如果存在控制字符,则不希望实际查找^A。但很难确定文件中实际存储了什么。我建议使用以特殊方式显示不可见字符的编辑器来确保。然后,您可以使用各种转义方法来表示不可见字符并查找它们。 - Domino
“无法识别”是什么意思?您是否收到了异常?如果是这样,它是什么,代码看起来像什么? - Wodin
我的意思是"^A"无法被读取,变得不可见。 - Andy Chang
3个回答

2

只需以二进制模式读取文件,如下所示:open('file.txt', 'rb')。Ctrl-A 的值将为 1。

with open('test.txt', 'rb') as f:
    text = f.read()
    for char in text:
        if char == b'\x01': # \x01 stands for the byte with hex value 01
            # Do something
            pass
        else:
            # Do something else
            pass

我没有使用完全相同的方法,但是你给了我一些非常好的灵感。在我的程序中,我使用了str.find("\x01")而不是str.find("^A"),它起作用了。谢谢! - Andy Chang

0

这些控制字符是ASCII字符集的一部分,其数字代码范围从0到31(或16进制中的00到1F)。要从字符串中去除它们,只需使用正则表达式替换:

import re
clean_string = re.sub(r'[\x00-\x1f]+', '', string_with_control_characters)

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接