zoukankan      html  css  js  c++  java
  • python成长之路第一篇(5)文件的基本操作

    一、三元运算 

    我们在上章学习的if,,else,,有一种简便的方法

    他的表达式是这样的:变量 = 值1 if 条件 else 值2

    image

    解释过来就是如果aaa等于sss则输出值1否则输出值2

    二、类的概念

    类是面向对象编程的核心, 它扮演相关数据及逻辑的容器角色。它们提供了创建“真实”
    对象(也就是实例)的蓝图。对于Python,一切事物都是对象,对象基于类创建。

    image

    如何查询对象的类呢?

    image

    为啥分为有下划线和没下划线的呢,这些又是什么呢?本例中以查看的是列表的类,那么这个类下面就有了很多的方法也就是下面看到的,带下划线的为内置方法,不带下划线的非内置方法只能表示一种方式,只能执行一种方式。也就是说这个变量是列表类型的就能使用这个列表类的所有方法

    type:查看对象的类型

    dir(类型名)查看类中提供的功能

    help(类型名)查看类中所有详细的功能

    help(类型名.功能名称)查看类中某功能的详细信息

    这里只是了解一下至于功能后续会有专门的文章写

    Pycharm看类的方法:

    image

    三、文件操作

    python是怎么操作文件的呢?我们一起来看一下,一般来说对文件的操作有这么几种读写追加

    open函数

    不同模式打开文件的完全列表:

           模式       描述

    r

    以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

    rb

    以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。

    r+

    打开一个文件用于读写。文件指针将会放在文件的开头。

    rb+

    以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。

    w

    打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

    wb

    以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

    w+

    打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

    wb+

    以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

    a

    打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

    ab

    以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

    a+

    打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

    ab+

    以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    打开文件的模式有:

    • r,只读模式(默认)。
    • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
    • a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

    "+" 表示可以同时读写某个文件

    • r+,可读写文件。【可读;可写;可追加】
    • w+,写读
    • a+,同a

    "U"表示在读取时,可以将 自动转换成 (与 r 或 r+ 模式同使用)

    • rU
    • r+U

    "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

    • rb
    • wb
    • ab

    (1)打开文件

    foo = open('test','r') #open是关键字,test是文件的名称,r是打开的模式为只读
    print(foo)

    <_io.TextIOWrapper name='test' mode='r' encoding='cp936'>

    哦?返回的是什么东东,原来在打开文件后,foo的值等于一个迭代器,迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。迭代器不能回退,只能往前进行迭代。

    那怎么能够看到里面的内容呢?非常简单

    (2)加载文件内容到内存

    read()函数:

    foo = open('test','r')
    foo = foo.read()
    print(foo)

    只需要foo 等于foo.read(),read函数的作用就是从一个打开的文件中读取一个字符串。

    据说有人不喜欢read方式来读取文件!!这是为什呢呢?

    因为:

    read()的机制是将文件内容一股脑的读入内存,满足不了大家的需求

    所以出现了readlines()一次性加载所有内容到内存,并按照行分割,合成列表

    readlines()

    foo = open('test','r')
    ss = foo.readlines()
    print(ss)
    ['a
    ', 'bb
    ', 'ccc
    ', 'dddd
    ', 'eeeee']
    纳尼
    是毛毛啊,哦原来是换行符吓老子一跳,还有人说了 我就1M的内存读1G的文件,你不是要我命么,没关系python还有另外的方法来处理文件
    readline()
    每次仅读取一行数据,这样我们就可以for循环,处理到要处理的内容退出就好了
    foo = open('test','r+')
    ss = foo.readline()
    dd = foo.readline()
    print(ss+dd)

    a
    bb

    (3)读取中文文件

    有勤快的小同学就试了试,尼玛为啥中文文件就报错呢?其实呢,不是你写错的而是编码问题

    ①编码与解码

    对于中文文件编码格式为gbk,所以在正常的情况下我们使用Pycharm进行调试时用的是uft-8的编码格式所以会报错

    image

    我们知道我们现在一般接触三种编码格式分别是,gbk,utf-8,unicode

    unicode:万国码Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

    utf-8:UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言

    GBK:是汉字编码标准之一中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订

    那么他们之间的关系是什么样的呢,其实主需要记住一点就好,gbk,utf-8它的源是unicode,所以呢请看下图

    image

    decode是解码,encode是编码,也就是gbk想要转换成utf-8就需要先把gbk解码成unicode,然后unicode在编码成utf-8,我们来试一下

    ②python2.7和3.5正常输出中文的多种方法

    这些方法主要目的都是为了把编码变成utf-8

    python2.7:

    方法1:在pycharm项目目录下用windows创建一个txt文件

    foo = open('ttt.txt','r')
    ss = foo.read().decode('gbk')
    print ss


    二二
    三三三
    四四四四
    五五五五五
    六六六六六六

    python3.5:

    0.0是不是很郁闷他自己就可以不需要变换编码

    foo = open('ttt.txt','r')
    ss = foo.read()
    print (ss)
     
    codecs函数重点来了:
    不管是2.7还是3.5有一些特殊的情况无法输出中文字符则我们用到codecs这个函数
    image 
    调用了codecs函数后:
    image 
    其实呢方法很简单激素codecs这个函数也提供了open的方法,只需要codecs.open(‘文件名’,’打开模式’,’编码格式’)就好了。
    注意:
    使用pycharm切换2.7和3.5的时候可能出现混乱建议实际测试为准
     
    (4)写入操作
    python提供了这么多种打开方式,其实常用不没有几个r,r+,w,w+,a,a+我们一一来看①r+啥情况我前面的东西呢!!,额好吧全被替换掉了(推荐测试使用linu毕竟都是运行在linux中
    image 
    ②w,汗以前的内容全被替换掉了,w+就不用测试了吧
    image 
    ③a哦原来追加到最后了为毛不换行!在前面加个 试试
    image 
    image 
    (5)删除
    对于python来说没有提供直接删除文件内容的功能,所以只能使用语句来判断(反正我是不知道)
    例子:反正是特别麻烦后面可以使用with 来优化一下我来解释一下,首先打开文件,for当i的内容等于ccc
    的情况下什么也不做,否则添加入列表,因为有换行符所以有
    ,最后用w+打开文件把列表中的内容写入进去即可
     1 foo = open('text','r')
     2 aa = foo.readlines()
     3 ccc = []
     4 for i in aa:
     5     if i == 'ccc
    ':
     6         continue
     7     else:
     8         ccc.append(i)
     9 foo.close()
    10 
    11 foe= open('text','w+')
    12 for iss in ccc:
    13     foe.write(iss)
    14 foo.close()
    删除
    (6)file对象的属性
    以下是和file对象相关的所有属性的列表:
    image 
    例子:
    fo = open("foo.txt", "r+")
    print "文件名: ", fo.name
    print "是否已关闭 : ", fo.closed
    print "访问模式 : ", fo.mode
    print "末尾是否强制加空格 : ", fo.softspace
    结果:
    文件名:  foo.txt
    是否已关闭 :  False
    访问模式 :  wb
    末尾是否强制加空格 :  0

    (7)文件定位

    大家看到上面的打开方式的列表中有一个这样的词语‘指针’,那么这个指针就类似于光标定位的位置,所以在python中,就有这个定位的操作

    原文件text

    aaa
    bbb
    ddd
    fff

    ①打开文件,为什这里只输出了aaa bb呢,是因为read()后面加了个指针,指到了6,所以输出了这个,有人还问了那指到了6应该输出三个b啊现在怎么是两个呢,其实呢是因为你妹的还有个换行符占了个位置

    1 foo = open('text','r+')
    2 aa = foo.read(6)
    3 print(aa)
    4 aaa 
    5 bb
    文件定位-打开文件
    ② 查找当前位置tell()
    foo = open('text','r+')
    aa = foo.read(3)
    ss = foo.tell()
    print(aa,ss)
    ③把指针再次重新定位到文件开头
    1 foo = open('text','r+')
    2 aa = foo.read(3)
    3 print(foo.tell())
    4 print(aa)
    5 foo.seek(0, 0)
    6 print(foo.tell())
    7 3 
    8 aaa 
    9 0
    重新定位指针
  • 相关阅读:
    什么是Portal!
    Maven 让事情变得简单
    HTTP协议详解
    函数实现不放在头文件的原因,及何时可以放头文件的情况
    Linux中的内存管理(四)Heap
    寿星万年历Lua实现
    TCP epoll触发后只accept一次带来的问题
    生产者消费者问题
    Windows SDK 实现不规则窗口
    论迭代式的产品开发方法
  • 原文地址:https://www.cnblogs.com/bj-xy/p/5183741.html
Copyright © 2011-2022 走看看