下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 20 | 文件的常用操作
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

零基础学Python

共71讲 · 71课时·约540分钟
16024
免费
01 | Python语言的特点
免费
02 | Python的发展历史与版本
免费
03 | Python的安装
免费
04 | Python程序的书写规则
免费
05 | 基础数据类型
免费
06 | 变量的定义和常用操作
07 | 序列的概念
08 | 字符串的定义和使用
09 | 字符串的常用操作
10 | 元组的定义和常用操作
11 | 列表的定义和常用操作
12 | 条件语句
13 | for循环
14 | while循环
15 | for循环语句中的if嵌套
16 | while循环语句中的if嵌套
17 | 字典的定义和常用操作
18 | 列表推导式与字典推导式
19 | 文件的内建函数
20 | 文件的常用操作
21 | 异常的检测和处理
22 | 函数的定义和常用操作
23 | 函数的可变长参数
24 | 函数的变量作用域
25 | 函数的迭代器与生成器
26 | Lambda表达式
27 | Python内建函数
28 | 闭包的定义
29 | 闭包的使用
30 | 装饰器的定义
31 | 装饰器的使用
32 | 自定义上下文管理器
33 | 模块的定义
34 | PEP8编码规范
35 | 类与实例
36 | 如何增加类的属性和方法
37 | 类的继承
38 | 类的使用-自定义with语句
39 | 多线程编程的定义
40 | 经典的生产者和消费者问题
41 | Python标准库的定义
42 | 正则表达式库re
43 | 正则表达式的元字符
44 | 正则表达式分组功能实例
45 | 正则表达式库函数match与s...
46 | 正则表达式库替换函数sub...
47 | 日期与时间函数库
48 | 数学相关库
49 | 使用命令行对文件和文件夹...
50 | 文件与目录操作库
51 | 机器学习的一般流程与NumP...
52 | NumPy的数组与数据类型
53 | NumPy数组和标量的计算
54 | NumPy数组的索引和切片
55 | pandas安装与Series结构
56 | Series的基本操作
57 | Dataframe的基本操作
58 | 层次化索引
59 | Matplotlib的安装与绘图
60 | 机器学习分类的原理
61 | Tensorflow的安装
62 | 根据特征值分类的模型和代...
63 | 网页数据的采集与urllib库
64 | 网页常见的两种请求方式ge...
65 | HTTP头部信息的模拟
66 | requests库的基本使用
67 | 结合正则表达式爬取图片链...
68 | Beautiful Soup的安装和...
69 | 使用爬虫爬取新闻网站
70 | 使用爬虫爬取图片链接并下...
71 | 如何分析源代码并设计合理...
本节摘要

《三国演义》人物名单及兵器谱文本下载地址:

https://github.com/wilsonyin123/geekbangpython/tree/master/txt

展开

精选留言(30)

  • 2019-01-20
    read 和 seek 的单位是字符还是字节呢?

    作者回复: 操作的单位都是字节。
    另 ASCII码中,一个英文字母占一个字节,中文汉字占两个字节;UTF-8编码中,一个英文字母占一个字节,中文占三个字节;Unicode编码应为和中文都是两个字节。

    1
    6
  • 2018-07-26
    不友好,文件的第一个字符是1,tell()输出的也是位置1,很容易乱,为什么不多进行几个呢?比如到第5个字符,这样不就去分开“位置的指针数字”和“内容的数字”,没想过新手会蒙圈你说的1到底是哪个1么?。。。

    作者回复: 有道理,改变文件内容或者多移动几个位置会让大家更好理解,谢谢你的反馈,后面注意提升演示代码友好度。

    5
  • 2018-07-08
    老师,您在视频中演示的把之前的内容注释掉是怎么操作的,谢谢

    作者回复: 在pycharm使用ctrl+/ 可以把选中的行注释掉,再次输入可以取消注释

    4
  • 2018-07-04
    好难啊。。。。

    作者回复: 学习编程是一条不断上升的曲线,爬过波峰会看到更美的风景,加油哦!

    4
  • 2018-07-26
    老师我的是mac系统。版本3.7
    为什么文件是中文的时候seek的第二个参数不能为1。而且为0的时候偏移之后文件不能读取。感觉有很多东西老师你都没讲啊

    作者回复: seek()操作非常简单,这里主要希望大家了解文件指针这个概念,因此我没有太详细讲解每个参数。一般我们对文本经常用到的就只有移动到开头和移动到结尾操作。如果需要使用第二个参数,需要在打开文件的时候使用b参数,我想你遇到的问题应该是open(‘文件名’,‘r’) 只使用了r参数。这个是Python的规定了。



    常用操作如下:

    # 移动到文件开头,重新读取文件
    f = open(‘b.txt’,’rb’)
    # b.txt 内容
    f.read()
    # b’hello python1\nhello python2\n'
    f.seek(0) # 移动到文件的开头
    f.seek(0,0) # 移动到文件的开头

    # 移动到文件结尾,以便追加新的信息
    f.seek(0,2) # 28

    # 注意这两种操作无需open()函数的第二个参数使用’b’参数,但是当你使用seek()函数第二个参数为1、2时,第一个参数如果是非0 就要增加’b’参数,否则会报错了。

    #取得倒数第三个字符
    f.seek(-3,2) # 25
    f.read(1) # b’n’

    # 取得第7个字符
    f.seek(0) # 0
    f.seek(6,0) # 6
    f.read(1) # b’p’

    # 另一种方法
    f.seek(4,0) # 4
    f.seek(2,1) # 2
    f.read(1) # b’p’

    了解了什么情况能够使用seek()第二个参数之后再来说一下中文的问题。因为中文涉及到两种常见编码:
    utf-8和gb2312,由于你使用的是mac系统,默认在文本文件写入一个汉字,就会占用三个位置。
    例如:“你好” 使用 open(‘filename’,’rb’)方式打开就是 b'\xe4\xbd\xa0\xe5\xa5\xbd’ 这样的内容,那么要注意操作汉字必须要保证是三个位置一起操作,才是操作一个汉字。而如果open()函数不带b参数,seek()函数依然只能使用移动到开头和结尾,没有看到你的具体错误信息,但我猜想这可能就是你的报错原因了,比如使用seek读取第二个汉字

    f = open('b.txt','rb') # '你好,python\n极客时间\n'
    f.read()
    # b’\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cpython\n\xe6\x9e\x81\xe5\xae\xa2\xe6\x97\xb6\xe9\x97\xb4\n'
    f.seek(1,0) # 1
    f.seek(2,1) # 3
    f.read(3).decode('utf-8') # ‘好’

    2
  • 2019-04-23
    我遇到了一个问题想请教一下老师。在本节前面的内容都没问题,直到最后要将 file6.seek(0) 改为 file6.seek(5,0)。
    代码如下:
    ======
    file6 = open('name.txt')
    print('当前文件指针位置 %s' %file6.tell())

    print('当前读取到了一个字符:%s' %file6.read(1))
    print('当前文件指针位置%s' %file6.tell())

    # 注意seek参数,第一个代表偏移量,第二个代表偏移起始位置
    file6.seek(5,0)
    print('进行了seek操作')
    print('当前文件指针位置%s' %file6.tell())

    print('当前读取到了一个字符:%s' %file6.read(1))
    print('当前文件指针位置%s' %file6.tell())

    file6.close()
    ======

    输出的结果是
    ======
    Traceback (most recent call last):
      File "D:/DongYunbo/python文件/file_op.py", line 36, in <module>
        print('当前读取到了一个字符:%s' %file6.read(1))
    当前文件指针位置 0
    UnicodeDecodeError: 'gbk' codec can't decode byte 0xc1 in position 2: illegal multibyte sequence
    当前读取到了一个字符:a
    当前文件指针位置1
    进行了seek操作
    当前文件指针位置5
    ======

    感觉是由于编码的问题,中文字“诸”无法输出,可是要如何解决呢?尝试了 open('name.txt',encoding='utf-8') 也会报错(不一样的错误)。
    感谢老师的回答与付出。
    展开

    作者回复: 您好,UnicodeDecodeError: 'gbk' 是表示文件为gbk编码,可以使用open('name.txt',encoding='gbk')方式读取, 另外要注意由于seek()是按照字节操作的,如果文件里面有汉字要注意两个字节一个汉字。

    1
  • 2018-12-02
    因为中文占两个bytes,如果 file6.read(3) ,读取的字符串是:“1 诸” ,指针实际是在第四个位置,所以 file6.tell() 则会返回 4。
    1
  • 2018-07-06
    老师,为什么我在文件中写上汉字,读取文件出来的都是乱码。

    作者回复: 要保证读写编码一致才会不出现乱码,例如windows是gb2312,linux是utf8,python要根据需要调整写入和读取的编码,保证读写的参数 文件的编码 操作系统的编码一致才会不出现乱码

    1
  • 2019-11-29
    在视频中没有看到您讲解as使用方法,看您作业当中就有使用,老师能够给讲解as是什么意思吗

    作者回复: 您好, 作业里面我使用了 with 这个 上下文管理器打开文件, as 后面跟的是文件描述符, 意思是打开文件成功之后,后续对文件操作可以使用此文件描述符即可,在课程后面有关于with 的讲解。

  • 2019-11-22
    file6=open('name.txt')
    print(file6.tell())
    file6.read(1)
    print(file6.tell())
    file6.read(1)
    file6.seek(0)
    print(file6.tell())
    file6.read(1)
    print(file6.tell())

    结果:
    0
    2
    0
    2
    为什么同样的代码,我的指针每次移位输出为2,您的是1?
    展开

    作者回复: 偏移量和文件内容以及字符编码是有关的,比如我的第一个是字母,偏移就是1;如果是gb2312字符集,第一个是汉字,偏移量就是2,utf8字符集就是3

  • 2019-11-22
    print(file.write('hello'))为什么输出的内容不是hello而是2呢?想问下这个输出的这个2是什么

    作者回复: file.write('hello') 是把内容写入到文件,得到的是写入字符的数量,这里如果打印返回值,应该为5。
    注意: 官方文档中描述write( )无返回值,所以不应该有print 输出

  • 2019-10-29
    老师你好,我刚试验的时候,seek第一个参数为0的时候一切正常,当第二个参数为2时,没有使用‘b函数时报错,看了老师您解答其他同学疑问后,加了‘b’,但指针的实际位置与屏幕输出的不同,麻烦老师帮我看下是哪里有问题,谢谢。
    name.txt内容如下
    a lucy
    b tom
    c lily

    代码如下
    file6=open('name.txt','rb')
    file6.seek(3,2)
    print('当前指针位置是 %s' %file6.tell())
    print('当前指针位置的内容是 %s' %file6.read(1))
    print('当前指针位置是 %s' %file6.tell())
    file6.close()

    屏幕输出如下:
    当前指针位置是 24
    当前指针位置的内容是 b''
    当前指针位置是 24
    展开

    作者回复: 试试 seek(-3,2)

  • 2019-09-20
    open的file,mode这些属性都得用字符串?

    作者回复: open()是python的内置函数,用法参考这里:https://docs.python.org/zh-cn/3.6/library/functions.html#open

    1
  • 2019-06-14
    请教老师,这个报错是什么原因?谢谢
    C:\Users\Administrator\PycharmProjects\dierci\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/dierci/name.py
    0
    a 诸葛亮
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/dierci/name.py", line 17, in <module>
        file6.seek(2,2)
    io.UnsupportedOperation: can't do nonzero end-relative seeks

    Process finished with exit code 1
    代码:
    file6=open('name.txt')
    print(file6.tell())
    print(file6.read(5))
    #第一个参数代表偏移位置,第二个参数0表示从文件开头偏移,1表示从当前位置偏移,2从文件结尾
    file6.seek(2,2)
    print(file6.tell())
    文件name.txt为:
    a 诸葛亮
    b 曹操
    c 刘备
    d 关羽
    e 张飞
    展开

    作者回复: 在python3中,没有使用b模式选项打开的文件,只允许从文件头开始计算位置,从文件尾计算时就会引发异常
    需要使用 file6 = open('name.txt','rb')

  • .
    2019-06-03
    file6 = open('name.txt')
    # print('当前文件指针的位置 s%' %file6.tell())
    print( '当前读取到了一个字符,字符的内容是 s%' %file6.read(1))
    print(file6.tell())
    print(file6.seek(0))
    print( '进行了seek操作')
    print(file6.tell())
    file6.read(1)
    print(file6.tell())
    报错如下:
    /Users/paulakisscat/PycharmProjects/venv/bin/python /Users/paulakisscat/PycharmProjects/file_op.py
    Traceback (most recent call last):
      File "/Users/paulakisscat/PycharmProjects/file_op.py", line 25, in <module>
        print( '当前读取到了一个字符,字符的内容是 s%' %file6.read(1))
    ValueError: incomplete format
    老师您好,代码报错了,但不知道错在哪里,上次提出的问题也是,还没有得到回复,辛苦老师解答
    展开

    作者回复: 您好, 在第一句 print('当前读取到了一个字符,字符的内容是 s%' % file6.read(1)) 就产生了报错,
    可以根据错误提示的 File "/Users/paulakisscat/PycharmProjects/file_op.py", line 25 定位到哪个文件的第几行产生的错误,而ValueError: incomplete format 是类型错误,字符串替换应该是%s,而不是s%

  • 2019-05-29

    UnicodeDecodeError: 'gbk' codec can't decode byte 0xc1 in position 2: illegal multibyte sequence
    老师,这种报错要怎么解决

    作者回复: 文本不是gbk编码,假设文本时utf-8 编码,在open()的时候增加encoding=utf-8 参数来解决

    1
  • 2019-05-14
    老师你好:
    文档内容:
    a诸葛亮
    2.刘备
    3.关羽
    代码:
    file6=open('name.txt')
    print('当前文件指针的位置 %s' % file6.tell())
    print('当前读取到了一个字符,字符的内容是 %s' % file6.read(3))
    print('当前文件指针的位置 %s' % file6.tell())
    print('当前读取到了一个字符,字符的内容是 %s' % file6.read(2))
    print('当前文件指针的位置 %s' % file6.tell())
    结果:
    当前文件指针的位置 0
    当前读取到了一个字符,字符的内容是 a诸葛
    当前文件指针的位置 5
    当前读取到了一个字符,字符的内容是 亮

    一个汉字不是两个字节吗?read(3)结果不应该是a诸吗?而且指针不是应该在3吗?
    展开

    作者回复: 我使用gbk编码重现了你的结果,把你的问题再简单化就是:英文字母占1字节,gbk编码汉字占2字节,utf-8编码汉字占三字节,按照官方文档写法read(3)应该读取三个字节,应该是“a诸”,而不是“a诸葛”
    官方文档描述如下:
    “read(size=-1)
    Read up to size bytes from the object and return them”
    文档链接 https://docs.python.org/zh-cn/3.6/library/io.html

    产生这样结果的原因在open( )函数,如果open( )函数的参数带“b” 则read会按照字节读取,如果不带就会按照字符读取,即:utf-8汉字会读取一个完整汉字(一个字符,三个字节),gb2312也会读取一个完整汉字(一个字符,两个字节)

  • 2019-04-19
    首先,你的新文件名来源于文本内容本身,就需要一个暂存的空间--变量。如果存储多个,还是顺序的要考虑使用一个顺序的数据结构,列表是一个很好的选择。最后文本处理一定是按顺序读取的,而你的需求应该是逐行读取,那要考虑在每行读入进来之后,判断这行作为文件名还是文件内容对待,如果文件名要做创建文件处理,如果内容,要做添加到文件中处理。希望能帮到你
    ………………………………………………………

    我尝试了这样去处理这个文本,但是当我写入了第一份文件后,如何判断写入下一个文件成了我的一个问题。当我判断这个为文件名后,这里有一个if条件,做文件名处理,但是下一行内容不满足这个条件,就进入不到写入的这个条件下面去执行写入。
    展开

    作者回复: 把当前文件名暂存成变量,从原始文件读取到下一个文件名之后可以做对比

  • 2019-04-18
    老师你好,我有一个文本文件,格式类似下面这样,
    示例系统1
    192.168.1.0
    192.168.3.0
    示例系统2
    192.168.31.0
    192.168.31.123
    示例系统3
    192.168.21.1
    192.168.21.3
    ……
    然后我想处理这个文本,另存为以示例系统的名称为文件名,新文件的内容为他对应的IP,但是我想的办法逻辑上有点问题,导致不能正常处理,想请问老师,这样的文本处理有什么好的经验方法没有?
    谢谢。
    展开

    作者回复: 首先,你的新文件名来源于文本内容本身,就需要一个暂存的空间--变量。如果存储多个,还是顺序的要考虑使用一个顺序的数据结构,列表是一个很好的选择。最后文本处理一定是按顺序读取的,而你的需求应该是逐行读取,那要考虑在每行读入进来之后,判断这行作为文件名还是文件内容对待,如果文件名要做创建文件处理,如果内容,要做添加到文件中处理。希望能帮到你

  • 2019-04-15
    只要用了open函数,一定要用close关闭吗?

    作者回复: 是的,不同操作系统对进程打开的文件数量是有限制的,超过一定数量会打开文件失败,为了规避这样的错误,需要显式关闭;还有一种被动关闭的方式是该进程执行结束,操作系统会关闭该进程打开的文件