在Python中指定字符
我需要一个函数,可以遍历文件中的所有行。
这是我目前的代码:
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 个回答
也许如果你能解释一下这个文件是什么,为什么里面有很多'\x00',还有你为什么觉得需要以二进制模式读取它,我们就能帮你解决你根本的问题。
否则,可以试试下面的代码;它避免了依赖于(或受到)你操作系统的换行符的影响。
lines = open("the_file", "rb").read().split("\r")
for line in lines:
process(line)
补充说明:ASCII NUL(不是“NULL”)字节是"\x00"。
我觉得你可能对“for x in file”这个用法有些混淆。假设你是用“file = open(file_name)”来打开文件的,那么这里的“byte”其实代表的是整行内容,而不是单个字符。所以你只有在整行内容是一个换行符的时候才会调用“yield”。你可以试着把“byte”改成“line”,然后用第二个循环来遍历它。
如果你能控制文件的打开方式,我建议你使用通用换行符来打开文件。因为如果你只是用'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')