设为首页收藏本站
查看: 81|回复: 0

[PHP] Python中open()函数指定文件打开方式的用法

[复制链接]

论坛元老

Rank: 6Rank: 6

积分
34274
主题
17031
UID
1347
M币
67
贡献
17176

  • 发表于 2017-5-14 02:44:00 | 显示全部楼层 |阅读模式
    文件打开方式
    当我们用open()函数去打开文件的时候,有好几种打开的模式。
    'r'->只读
    'w'->只写,文件已存在则清空,不存在则创建。
    'a'->追加,写到文件末尾
    'b'->二进制模式,比如打开图像、音频、word文件。
    '+'->更新(可读可写)
    这个带'+'号的有点难以理解,上代码感受下。
    with open('foo.txt', 'w+') as f: f.write('bar\n') f.seek(0) data = f.read()
    可以看到,上面这段代码,它不但可以写,还可以读出来。注意要先定位到开头,f.seek(0),不然读出来的是空数据。
    一些人可能会有迷惑,既然带'+'号是可读可写,那'w+'跟'r+'有什么不同。
    那就是,
    'w+'会清空,会创建 (文件已存在则清空,不存在则创建。)
    'r+'不清空,不创建
    不要用二进制模式打开文本文件
    先看下面代码的“诡异”现象。
    假设在windows下,我有个f.txt文件,里面的内容是下面这样的。

    hello world
    代码一,
    with open('f.txt', 'r') as f: print f.readlines() with open('f.txt', 'rb') as f: print f.readlines()
    输出

    ['hello\n', 'world\n'] ['hello\r\n', 'world\r\n']
    代码二,
    with open('f.txt', 'rb') as f: data = f.read() with open('f.txt', 'w') as f: f.write(data)
    打开文件,变成了下面这样,

    hello^M world^M
    首先,先理解换行符'\n'跟回车符'\r'的概念。
    '\n',换行符(LF,Line-Feed ),指新的一行。
    '\r',回车符(CR,Carriage-Return),指回到行头。
    因为在不同系统下的换行标识是不一样的。

    windows->'\r\n' unix->'\n' mac->'\r'
    这就是为什么windows下的txt在linux打开的时候行尾会有'^M'。
    这就是为什么我在linux下跑脚本导出游戏数据下到本地windows打开变成了一行。
    其实文本文件也是二进制文件,是文本编码的二进制文件,文本文件对一些不可见字符进行了处理,增加可读性。
    在python中,可以通过os.linesep获得当前系统的换行标识。比如在windows下,os.linesep是'\r\n'。
    在python中操作换行标识的时候,并不用管是在什么平台下,直接用'\n'就行了,python会自动根据不同系统转成不同标识。
    有了上面这些理论依据,就可以解析本文开头代码的“诡异”现象了。
    代码一中,用文本模式打开的文件,换行标识会被python处理成'\n',而用二进制模式打开则原封不动。
    代码二中,用二进制模式打开,用文本模式写入。二进制打开原封不动还是'\r\n',而文本模式写入的时候因为python会把'\n'转成'\r\n',所以其实就等于是写入了'\r\r\n',于是就多了个'^M'。
    更多Python中open()函数指定文件打开方式的用法相关文章请关注PHP中文网!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在我站开通SVIP可同时获得17个站点VIP资源 立即登录 立即注册
    快速回复 返回顶部 返回列表