在Python中指定字符

0 投票
5 回答
571 浏览
提问于 2025-04-15 17:09

我需要一个函数,可以遍历文件中的所有行。
这是我目前的代码:

def LineFeed(file):
    ret = ""
    for byte in file:
        ret = ret + str(byte)
        if str(byte) == '\r':
            yield ret
            ret = ""

文件中的所有行都是以 \r 结尾的(不是 \n),而且我是在 "rb" 模式下读取的(我必须以二进制方式读取这个文件)。
但是 yield 似乎没有起作用,什么都没返回。可能是比较的时候出了问题?
我不太确定在 Python 中怎么表示一个字节或字符。

我感觉如果在 "rb" 模式下用 for 循环,它还是会尝试按行遍历,而不是按字节遍历……我该怎么按字节遍历呢?
我的问题是,我没有标准的行结束符。而且我的文件里充满了 0x00 字节,我想把它们全部去掉,所以我觉得我需要一个第二个 yield 函数,我该怎么实现呢?我就是不知道在 Python 中怎么表示 0x00 字节或 NULL 字符。

5 个回答

2

也许如果你能解释一下这个文件是什么,为什么里面有很多'\x00',还有你为什么觉得需要以二进制模式读取它,我们就能帮你解决你根本的问题。

否则,可以试试下面的代码;它避免了依赖于(或受到)你操作系统的换行符的影响。

lines = open("the_file", "rb").read().split("\r")
for line in lines:
    process(line)

补充说明:ASCII NUL(不是“NULL”)字节是"\x00"。

2

我觉得你可能对“for x in file”这个用法有些混淆。假设你是用“file = open(file_name)”来打开文件的,那么这里的“byte”其实代表的是整行内容,而不是单个字符。所以你只有在整行内容是一个换行符的时候才会调用“yield”。你可以试着把“byte”改成“line”,然后用第二个循环来遍历它。

1

如果你能控制文件的打开方式,我建议你使用通用换行符来打开文件。因为如果你只是用'rb'模式,\r不会被识别为换行符,但如果你用'Urb'模式,它就会被识别。

不过,这样做的前提是你的二进制文件里不能同时包含\n和\r,因为使用通用换行符后,\r和\n之间的区别就会消失。

假设你希望输出的行仍然以\r结尾:

NUL = '\x00'
def lines_without_nulls(path):
    with open(path, 'Urb') as f:
        for line in f:
            yield line.replace(NUL, '').replace('\n', '\r')

撰写回答