黑马程序员技术交流社区

标题: 【郑州校区】Python基础:文件的操作 [打印本页]

作者: 我是色色    时间: 2017-12-6 16:21
标题: 【郑州校区】Python基础:文件的操作
本帖最后由 我是色色 于 2017-12-6 16:24 编辑

一、python可以在不导入任何模块的情况下对文件完成读、写、追加,替换(稍复杂)。

二、打开文件:
        1、f = open('text.txt')
            这种方式打开,操作完后需要使用f.colse()关闭。
        2、with open('text.txt') as f:
            这种方式打开,运行完系统自动关闭,回收内存。建议使用。

三、文件打开模式:
        python操作文件的时候,默认是只读的,需要指定各种模式才能进行相应的操作,模式列表:
r
以只读方式打开文件
r+
先读,再写模式
rb
以二进制格式只读打开,图片,视频等文件
rb+
二进制格式,先读再写
a
以追加格式打开f.write(),在最后一行追加,文件不存在,创建文件。
a+
以读写格式打开f.write(),在最后一行追加,文件不存在,创建文件。
ab
和a区别于,二进制
ab+
和ab区别于,二进制
w
写模式创建新文件,覆盖原文件,不可读
w+
写读模式,先写再读,创建新文件,覆盖原文件
wb
和w区别于,二进制
wb+
和wb区别于,二进制

四、文件的常用方法:
f.read(num)
默认读取整个文件,num可以设置设取的数据的大小(英文字符个数)
f.readlines(num)
默认读取整个文件,并以行为分隔符,返回值是一个列表,每行为一个元素
f.readline(num)
每次运行读取一行,最节省空间
f.write(str)
向文件写入数据,str必须是字符串类型。
f.tell()
显示当前指针位置,使用next()方法时不能使用tell()
f.seek(num)
设置指针位置,f.seek(0)文件开始,
f.flush()
强制把内存数据写入到文件。默认程序运行结束才写入
next(f)
逐行读取文件,f是打开的文件对象,不能与tell()同时用,一般迭代器用
    print(read_file.tell())
OSError: telling position disabled by next() call
f.close()
关闭打开的文件,清除内存


例子1:
[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em]19

[size=1em]20

[size=1em]21

[size=1em]22

[size=1em]23

[size=1em]24

[size=1em]25

[size=1em]26

[size=1em]27

[size=1em]28

[size=1em]29

[size=1em][size=1em]#假设文件test.txt内容如下
[size=1em]'''
[size=1em]0=000
[size=1em]1=100
[size=1em]2=200
[size=1em]3=300
[size=1em]4=400
[size=1em]5=500
[size=1em]6=600
[size=1em]7=700
[size=1em]8=800
[size=1em]'''
[size=1em]#1# 最省空间,最快的读取方式
[size=1em]# read_file.readline(),每运行一次,自动读取下一行
[size=1em]with open('file_text1.text', 'r') as read_file:
[size=1em]    f = read_file.readline()
[size=1em]    while f:                   # 在条件判断中,None和False都是False,其余为True,欢迎补充
[size=1em]        print(f, end='')              
[size=1em]        f = read_file.readline()
[size=1em]# 注意end,因为readline()读取包含换行符,print默认也加空行符,所以会出现空一行


[size=1em]#2# 其它方法组合操作
[size=1em]with open('file_text1.text', 'r') as read_file:
[size=1em]    f = read_file.read(5)
[size=1em]    print(f)                    # 运行结果是0=000
[size=1em]    print(read_file.tell())     # 当前位置是5
[size=1em]    read_file.seek(22)          # 将指针移动到22
[size=1em]    print(read_file.readlines())# '=300\n' 从位置22开始以行为元素,组成一个列表



例子2:
正常情况下,文件正常关闭时才把内存文件写入,使用flush()可以把立即写入文件。
使用with语句,只要跳出语句块,自动关闭文件。
[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em]19

[size=1em]20

[size=1em]21

[size=1em]22

[size=1em]23

[size=1em][size=1em]# input在with里面
[size=1em]d = {}
[size=1em]with open('file_text1.txt', 'w') as file:
[size=1em]    for i in range(20):
[size=1em]        file.write(str(i) + '=' + str(i)+'00\n')
[size=1em]    s=input('-----停止!文件未关闭,找不到file_text1.txt-----:')
[size=1em]     
[size=1em]     
[size=1em]# 把input移动到with外面   
[size=1em]d = {}
[size=1em]with open('file_text1.txt', 'w') as file:
[size=1em]    for i in range(20):
[size=1em]        file.write(str(i) + '=' + str(i)+'00\n')
[size=1em]s=input('-----停止!文件正常关闭,可以找到file_text1.txt-----:')


[size=1em]# 使用flush(),可以打开'file_text1.txt',每行都会立即写入
[size=1em]d = {}
[size=1em]with open('file_text1.txt', 'w') as file:
[size=1em]    for i in range(20):
[size=1em]        file.write(str(i) + '=' + str(i)+'00\n')
[size=1em]        file.flush()
[size=1em]        s=input('-----停止!有文件,有内容-----:')



例子3:
修改文件:
文件只有读,写,追加,没有修改方法。
如果要修改只能读取到内存修改再覆盖回去。
对于大文件,这种方法十分占内存,可能会造成死机。
所以,按行读取,修改后存入临时文件,是一个好方法!
[size=1em]
[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em][size=1em]temp_file, source_file = 'temp_info.txt', 'info.txt'
[size=1em]# 同时打开两个文件
[size=1em]with open(temp_file, 'w', encoding='utf-8') as temp_file_write,\
[size=1em]        open(source_file, 'r', encoding='utf-8') as file_read:
[size=1em]        file_read_line = file_read.readline()
[size=1em]        while file_read_line:
[size=1em]            temp_file_write.write(file_read_line)
[size=1em]            file_read_line = file_read.readline()
[size=1em]            
[size=1em]            
[size=1em]# 然后再把上面的temp_file和suorce_file换个位置,写回去就好了,是不是发现点什么?仔细思考吧:)




作者: 张家二小姐    时间: 2017-12-6 16:41
期待干货
作者: 我是楠楠    时间: 2017-12-7 17:03
支持更新更多的干货




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2