V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sensui7
V2EX  ›  Python

请问 Python 处理文本文件都要这样麻烦吗

  •  
  •   sensui7 · 2017-09-14 00:15:11 +08:00 · 5945 次点击
    这是一个创建于 2626 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我需要处理一些不同且未知编码的文件, 下面代码先用二进制打开检测编码, 然后再二次打开, 大家是怎么弄的? 以前用 node 的时候无脑用 utf-8 打开文件, 从没遇到错误(误, 是不报错, 但是文本也没有处理...)

      bf = open(f, 'rb')
      code = chardet.detect(bf.read())['encoding']
      print(f + ' : ' + code)
      bf.close()
      with open(f, 'r', encoding=code) as source:
        texts = extractText(source.readlines())
      source.close()  
      with open(splitext(f)[0] + '_texts.txt', 'w', encoding='utf-8') as dist:
        dist.write('\n\n'.join('\n'.join(x) for x in texts))
      dist.close()
    
    44 条回复    2017-09-19 21:34:32 +08:00
    knightdf
        1
    knightdf  
       2017-09-14 00:23:01 +08:00
    第一次读到的内容直接编码下不就行了?为啥要读第二次?
    a87150
        2
    a87150  
       2017-09-14 00:23:36 +08:00 via Android   ❤️ 21
    你怎么什么屁事都要发个贴
    minami
        3
    minami  
       2017-09-14 00:33:45 +08:00
    你写程序是不是从来不看别人怎么写的?
    sensui7
        4
    sensui7  
    OP
       2017-09-14 00:35:10 +08:00
    @knightdf 我需要处理字符串, 但是直接打开不知道编码, 会报错.
    我只能先用二进制打开检测编码, 然后再用那个编码打开, 这就是麻烦的地方
    minami
        5
    minami  
       2017-09-14 00:38:33 +08:00
    jiang42
        6
    jiang42  
       2017-09-14 00:55:47 +08:00 via iPhone
    你是不是从来不用搜索引擎的?

    真心推荐你好好看一看 How To Ask Questions The Smart Way

    特别是 Section Before You Ask
    Pastsong
        7
    Pastsong  
       2017-09-14 01:02:02 +08:00
    对不起,先 Block 了
    sensui7
        8
    sensui7  
    OP
       2017-09-14 01:07:34 +08:00
    不用回答了, 我全部 block 了, 惹不起, 惹不起, 反正以后也不会发帖了. 随便吧. 反正有 SO 就够了.
    sensui7
        9
    sensui7  
    OP
       2017-09-14 01:28:32 +08:00
    @a87150 Yeah, 屁事, 屁话 到处都是, 诸如申请信用卡会打电话核实吗之类的, 你的回帖在我眼里也是屁话, 下面全部都是屁话, 你不想看到我, 你可以把我 block, 但是你们不用了, 我把你们 block 了, 一次性且永久的.
    huntzhan
        10
    huntzhan  
       2017-09-14 01:37:41 +08:00
    OP 快去写一个封装 chardet 的 package 去打楼上的脸(笑)
    ltux
        11
    ltux  
       2017-09-14 02:59:25 +08:00 via Android
    @sensui7 程序就是用来干这个事儿的,你说麻烦?????
    fzinfz
        12
    fzinfz  
       2017-09-14 07:09:27 +08:00 via iPad
    只有我觉得 lz 问的是个好问题吗
    lz 需要的应该是

    try:
    无脑用 utf-8 打开文件
    except:
    pass
    xiaket
        13
    xiaket  
       2017-09-14 07:19:19 +08:00   ❤️ 4
    with 打开文件后不需要 close 了. 你以为你懂了 python.
    whwq2012
        14
    whwq2012  
       2017-09-14 07:28:08 +08:00
    python 的使用逻辑是如果遇到难处理的需求就直接找库,所以你不应该抱怨 python 语法麻烦。
    misaka20038numbe
        15
    misaka20038numbe  
       2017-09-14 08:19:56 +08:00   ❤️ 4
    题主肯定不熟悉这个社区。从我呆这么久的情况来看,这个社区并不是一个以解决问题为主的社区,这里的人大部分都是在打发自己无聊的时间而已,所以得到这样的回复完全没有必要在意。
    至于那些 block 之后还要说出来的,可能是认为 block 对对方影响很大,对方很在意自己被 block 吧。
    mimzy
        16
    mimzy  
       2017-09-14 08:34:25 +08:00   ❤️ 2
    5 楼和 10 楼已经解答了你的问题 https://github.com/chardet/chardet

    如果你的意思是希望 open() 的时候不报错,可以添加 errors='ignore' 参数。https://docs.python.org/3/library/functions.html#open

    @misaka20038numbe #15 从我呆这么久的情况来看,得到什么样的回复取决于提问题的方式。吐槽难以得到答案也无法解决问题。
    introom
        17
    introom  
       2017-09-14 08:38:09 +08:00 via Android
    问题是谁都可以回帖,不过除了极少数厉害的,其他都太弱了人,然而他们以及又不知道。
    XFLx2
        18
    XFLx2  
       2017-09-14 08:40:42 +08:00   ❤️ 1
    即使题主提问题的方式不对,我也很讨厌像 2L 那样的回复。为了喷人而回复,从来不对自己的恶意负责。
    bbsteel
        19
    bbsteel  
       2017-09-14 08:49:56 +08:00 via Android   ❤️ 1
    lz 直接用 js 不好吗?
    minami
        20
    minami  
       2017-09-14 09:02:40 +08:00
    呵呵,估计我也被 lz block 了,惹不起惹不起
    jtsai
        21
    jtsai  
       2017-09-14 09:24:00 +08:00
    请问个问题也能引来这么多恶意。目瞪狗呆😳,楼主不哭,俺挺你。
    arzterk
        22
    arzterk  
       2017-09-14 09:33:09 +08:00
    哈哈哈,心疼楼主;以后直接搜索了再来发帖免得被喷
    weakish
        23
    weakish  
       2017-09-14 10:17:49 +08:00
    @jtsai 但是这问题确实槽点太多,不知道从哪里吐起了。
    CryMeatel
        24
    CryMeatel  
       2017-09-14 10:26:46 +08:00
    …… LZ 完全是闲的无聊,用复杂于语言常规写法几倍的方式写出个问题,然后来吐槽下……

    百度先把,别折腾自己了……
    CryMeatel
        25
    CryMeatel  
       2017-09-14 10:28:23 +08:00   ❤️ 1
    这样回复比较正式:

    完全不用这么麻烦,建议先百度学习下基础。
    jtsai
        26
    jtsai  
       2017-09-14 10:48:07 +08:00
    @weakish 有一定的道理
    crab
        27
    crab  
       2017-09-14 10:53:42 +08:00
    @jtsai 主要原因不是这个帖子,而是前面那个对比贴。在不熟悉 Python 的情况下,去吐槽。
    NaVient
        28
    NaVient  
       2017-09-14 10:55:11 +08:00
    @jtsai 建议你去看看楼主的上一篇帖子,你就知道为什么楼主会被这么多人吐槽了
    weakish
        29
    weakish  
       2017-09-14 11:15:14 +08:00
    @CryMeatel 其实有些不用搜索就能意识到问题,比如 with 后再 close, 那这 with 设计出来是干什么用的?其实我很好奇这代码是从哪里学来的。

    @crab @NaVient 上一个帖子我倒觉得还好,虽然除了缩进以外我一个都觉得文不对题,但至少展示了某个习惯写 JavaScript 的人刚接触 Python 可能感到困惑的地方,如果要写类似 Python for JavaScript Programmer 之类的东西还有一定的参考价值。
    Wicked
        30
    Wicked  
       2017-09-14 12:34:35 +08:00 via iPhone
    我也想吐槽,python 处理字符串已经是神一般的容易了,你用 C++试试…
    对于楼主的问题,最简单的方法就是逐个编码 try catch,直到一种能成功
    sensui7
        31
    sensui7  
    OP
       2017-09-14 12:39:46 +08:00
    关于 python
    这两天的 python 的经历是这样的, 我之前用 node 写了一个处理字幕脚本, 要发给别人, node 依赖环境对于别人来说过于麻烦, 也许不麻烦, 但是我的习惯是让对方下载回来双击就能运行, 他不需要知道任何其他东西.
    考虑过 electron, 我实在是嫌弃太大, 脚本一共没几行, 干嘛打包进去那么大的一个环境.
    所以我就用了 python, 在网上看了一些语法, 就写了, 之前有人问我看的什么教材, 我压根就没看教材, 就是语法罗列.

    关于楼上
    你说的 with, 我以为就是忽略一些错误, 确实不知道可以自动关闭文件.

    关于这两个帖子
    我为啥在 v2 发, 因为我只是想听听一些个人化的观点, 现在我对这些观点都已经了解了. 是屁话(literally).

    我的看法
    我当然明白这是一个社区, 会得到各种各样的回复, 那些觉得我的吐槽没有道理没有意思没有水平的, 我觉得完全正常, 本来就是互取所需, 我也是从各种回复中寻找自己感兴趣的.

    但没想到此贴得到回复是这样的直接, 我是不是也要进那些我不感兴趣的帖子回复, 这屁事也来发帖?

    下一步
    还有, 我在另一个人的帖子里说: 十分讨厌抄袭我头像, 对方回复, "哈哈, 来咬我啊". 呵呵, 你们玩, 我撤了.
    HGladIator
        32
    HGladIator  
       2017-09-14 13:47:31 +08:00 via iPhone
    问题没什么,上一篇没看,就是这个抄袭头像,我笑了
    NathanHu
        33
    NathanHu  
       2017-09-14 14:00:00 +08:00
    一般对于用着不爽的工具,我都是选择换一个……
    NathanHu
        34
    NathanHu  
       2017-09-14 14:01:58 +08:00
    @fzinfz 或许是个好问题,但楼主有很明显的引战倾向(看他回复),好无聊……
    fy
        35
    fy  
       2017-09-14 16:14:11 +08:00
    这也太自我为中心了吧?惹不起惹不起
    jatesun
        36
    jatesun  
       2017-09-14 16:42:12 +08:00
    你会 python ?大吃一惊。。。
    Biwood
        37
    Biwood  
       2017-09-14 16:47:04 +08:00
    楼主这个头像跟昨天那个楼主很像,最近发的主题也很像,都是语言特性相关,都有引战倾向,可能被误认为同一个人了
    另外,如果要提问就老老实实提问,随意吐槽某个语言很容易让人反感,毕竟这里的程序员都有各自的立场...
    NaVient
        38
    NaVient  
       2017-09-14 17:30:18 +08:00
    @Biwood 就是同一个人,题目可以好好写为 Python 处理字符编码的问题. 楼主的题目是什么?Python 处理文本都这样麻烦吗?点进来一看这代码,我也是醉了.难道楼主这个不是引战?再看看他前一个帖子...
    yucongo
        39
    yucongo  
       2017-09-15 00:57:00 +08:00
    建议用 cchardet, 号称比 chardet 快 30000 倍,但一般快 10 倍、20 倍还是有的
    kohos
        40
    kohos  
       2017-09-15 14:35:50 +08:00
    @sensui7 node 命令行环境打包简单得不得了,下载个 32 位 node.exe ,写个运行的 bat,然后把依赖 node_modules 也打进包里,对方直接可以运行。除非你要弄 GUI 才搞 electron
    weakish
        41
    weakish  
       2017-09-17 11:10:14 +08:00
    @sensui7 打包 python 的话,Pyinstaller 和 py2exe 很方便。另外,其实写这些工具类的东西,Go 也蛮合适的(可以跨平台编译,最后的可执行文件里静态链接了库)。

    with 的话,你猜得不够准。接触新语言,有时候靠猜比看文档要快,但你得猜准。猜不准的话效率就低了。不过猜的能力也是要练的。培养了猜的能力,是有助于下一个概念或者下一门语言的学习的。长远来看未必亏。

    我这里提供一点猜 with 的思路:绝大部分情况下总是要关闭一个文件的,多打一行字倒还不算什么,关键是怕忘记关掉了,所以讲道理,类似 with 这样的东西设计的时候,不太可能不考虑这个常见的痛点的。

    不过我有点事后诸葛亮。我当初学 with 不是靠猜的,而是靠看文档。但是呢,我后来学另外一些语言,看到类似 with 的结构,就能很快领会这个设计的用意。
    weakish
        42
    weakish  
       2017-09-17 11:31:33 +08:00
    @sensui7 另外,网上一些直接的回复,你不要太在意。

    其实很多人是被《提问的智慧》一类的文章洗脑了。

    《提问的智慧》主要讲如何提出一个好问题,讲得很好,但是它忽略了一个重要的问题:

    人与人之间的交流,有的时候还是要讲一点礼貌的,特别是陌生人之间。网上打 RTFM 很容易, 但现实中你如果对一个不太熟悉的人说 Read the fucking manual, 如果你只是在玩梗那还好,如果你真的是这样想的,那其实是不怎么礼貌的。这会形成一种抑制交流的氛围,对协作(不仅是部门讲协作,网络的讨论其实也是一种协作)是不利的。

    想象一下,你刚升级某个软件,同事随口问一句「这个版本有什么新功能?」,你回答「你他妈不会自己去看发布日志吗?」如果一个团队里都是这样交流的话,你觉得这个团队的氛围好吗?

    而且,《提问的智慧》是有前提的,就是说开发者已经为开发自由软件花了大量时间了,你一个用户如果读手册能解决问题,那最好还是不要去挤占开发者的时间。

    但是用户相互之间,还是少用 RTFM 为妙。别人问了一个初级问题,你没时间完全可以不回答,有时间可以回答,或者简短地说「我记得手册的 XXX section 里有写」、「 google YYY 」没有必要特意回答一句「你他妈不会 google 吗?」
    cgwh
        43
    cgwh  
       2017-09-18 18:21:49 +08:00 via Android
    @weakish 说得中肯
    fiht
        44
    fiht  
       2017-09-19 21:34:32 +08:00
    大家辛苦一天了
    想来论坛吹吹牛逼
    然后看到楼主这么脏 /乱 /差(初级)的代码
    还把锅甩给蟒蛇
    就很生气

    -------------
    发现一个人
    用着和我们一样的小轿车
    却要推着走
    一边推还要
    这小轿车开起来真麻烦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   985 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:03 · PVG 05:03 · LAX 13:03 · JFK 16:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.