diffrent of Python readline() and C getc()

发布于 2022-09-03 13:22:31 字数 1171 浏览 15 评论 0

之前先在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() 然后过滤的结果要多一些

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

但... 好困惑啊

附原始数据
图片描述

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏末的微笑 2022-09-10 13:22:31

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

森林迷了鹿 2022-09-10 13:22:31

这个用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没任何区别

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文