首页 > diffrent of Python readline() and C getc()

diffrent of Python readline() and C getc()

之前先在Stackoverflow上提问的, 现在改成中文

最近需要处理一部分乱码数据

实际上只需要其中的字母和数字就够了

起初我写了像这样的C, 按照ASCII码表来进行过滤

int c;

while ((c = getc(stdin)) != EOF)
    if ((65 <= c && c <= 90) || (97 <= c && c <= 122) || // alphabet
        c == 10 || c == 13 ||                   // LF, CR
        (32 <= c && c <= 47) ||                // other
        (32 <= c && c <= 64) || (c <= 91 && c == 96))
        if (putc(c, stdout) == EOF)
            err_sys("output error");

if (ferror(stdin))
    err_sys("input error");

写完当然是没问题的
不过平时用python, 突然试着用下面的代码做对比

f = open('data.txt', 'r')
f.readline()

然后奇怪的事情就发生了!
比如原始数据里的一行
用getc()过滤是这样的

> twiiiiiii@2

但是用readline()却是这样的

> @2>&&>zC\rtwiiiiiii@2\n

注意, 这里的'@'和'2', 都没有被过滤(比如末尾的就还在)

就是Python 的readline()比C 的getc() 然后过滤的结果要多一些

个人觉得是两者对每个字节的最高位解释不同

但... 好困惑啊

附原始数据


可以试一试f.read(size)函数,把size设为1的话是逐字符读取的,然后再过滤数据。


这个用python很好办, 结果都一样啊, 是你姿势不太对

比如你过滤得到的这段内容> twiiiiiii@2, 我模拟一下, 假如待处理的文件(raw.dat)内容是这样

> t我w爱i北i京i天i安i门ii@2

上码

with open("raw.dat", "rb") as fh:
    line = fh.readline()
    print(line)
    print(line.decode('ascii', 'ignore'))

输出

b'> t\xce\xd2w\xb0\xaei\xb1\xb1i\xbe\xa9i\xcc\xeci\xb0\xb2i\xc3\xc5ii@2'
> twiiiiiii@2

所以没什么问题啊, 跟你用C没任何区别

【热门文章】
【热门文章】