zoukankan      html  css  js  c++  java
  • python关于文件操作中的字符个数和字节数

    记得刚开始学习python文件操作写文件的时候有个问题,很奇怪。最后知道了就是字节数的原因。

    我们先来看个例子。

    新建个文件存为utf-8命名为0117utf-8.txt记得去掉BOM头。

     我们用r+模式尝试去修改

    >>> fp=open("d:\pydelete\0117utf-8.txt","r+")
    >>> fp.write("aa")
    2
    >>> fp.close()
    >>>

    结果如下

    乱码一大坨。

    这里就涉及了字节数了。

    因为utf-8存中文是用3个字节存一个,存英文是用1个字节存一个英文字符。

    如果写入“aaa”就可以了。

     所以切入正题,看看字节数和字符个数。

    1.fp.read(arg),fp.write()后返回的数字是字符个数。

    我们用刚才写过的文件读一下看看。

    >>> fp=open("d:\pydelete\0117utf-8.txt","r+",encoding="utf-8")
    >>> fp.read(1)
    'a'
    >>> fp.read(1)
    'a'
    >>> fp.read(1)
    'a'
    >>> fp.read(1)    #可以看到这里的数字应该是字符个数,意思一个字符。
    '国'
    >>> fp.read(1)
    '话'
    >>> fp.read(1)
    ''
    >>>

    我们再来写入一些内容。

    >>> fp.seek(0.0)    #将游标切回行首
    0.0
    >>> fp.write("新写入2x")
    5                            #可以看到这里也是字符个数。表示写入5个字符。
    >>>fp.flush()

    我们算一个结果之前文件内容是“aaa国话”我们写入“新写入2x” 之前的文件字节数是9,现在写入11 r+模式会从头开始覆盖所以现在文件内容为“新写入2x”

    如果写入的字节数小于之前的有可能出现乱码(如果原文件有中文存在)

    2.fp.tell(),fp.seek(0,0) 是字节数

    我们加游标切回行首,再来读下。

    >>> fp.seek(0,0)
    0
    >>> fp.read(1)
    '新'
    >>> fp.tell()
    3                           #可以看出tell是返回的字节数,也就是游标现在应该在新字后边。
    >>>

    由此我们试着改变游标位置。

    >>> fp.seek(0,0)

    0
    >>> fp.seek(6,0)    #seek的第一个参数也是字节数,那现在游标在哪我如果读一个字符应该是什么?  游标应该在写字后如果读一个字符应该是“入”

    6

    ----------

    >>> fp.read(1)
    '入'

    3.fp.truncate(size)

    把文件裁成规定的大小,默认是裁到当前文件操作标记的位置。如果size 比文件的大小还要,依据系统的不同可能是不改变文件,

    也能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。参数也是字节数。

    我们来尝试一下

    >>> fp.seek(0,0)
    0
    >>> fp.truncate(6)    
    6
    >>>

    此时文件内容应该只剩下“新写”2字。

    知道这些我们在写文件的时候,就能很清楚效果了。

    关于字节数可以参考:

    https://www.cnblogs.com/King-Tong/p/11431561.html

  • 相关阅读:
    51 nod 1181 质数中的质数(质数筛法)
    Just oj 2018 C语言程序设计竞赛(高级组)F:Star(结构体排序+最小生成树)
    欧拉函数+费马小定理拓展
    ZOJ 3785 What day is that day?(数论:费马小定理)
    Just oj 2018 C语言程序设计竞赛(高级组)H: CBT?
    树链剖分(入门学习)
    bitset用法
    链式前向星
    Nearest Common Ancestors(LCA板子)
    LCA(最近公共祖先)
  • 原文地址:https://www.cnblogs.com/King-Tong/p/12205194.html
Copyright © 2011-2022 走看看