主要内容:
小目标:掌握文件基本操作 主要内容:文件基本操作; 文件读写; 编码格式;
如果看完这篇文章,你还是弄不明白文件; 你来找我,我保证不打你,我给你发100的大红包。
先来看下文件:
文件种类很多,txt,csv,excel等 不同文件可以使用不同模块去进行操作本文主要介绍文本文件操作。
1.文件操作基础
来看下基本操作:打开,读写,关闭 代码实现:#window下定义文件,使用r字符串 fpath = r'C:\Users\hyg\Desktop\data\test.txt' #open函数打开文件,返回文件对象 f = open(fpath) #read方法,将文件读完 lines = f.read() print(lines) f.close()
结果,文件内容:
this is test
看似简单,但是里面有很多知识点,我们来看下。
2. 文件打开
几个问题:
1.以什么方式打开 2.以什么编码格式打开 3.打开会有什么结果
2.1 打开文件:open函数详解open函数定义:
open( file,mode='r', buffering=-1, encoding=None, errors=None,newline=None,closefd=True,opener=None, )
主要参数:
参数 说明 file 文件路径或者IO对象 mode 文件打开方式 encoding 打开编码格式 2.2 mode详解 参数 说明 'r' 只读方式打开,不支持写 'w' 只写方式打开,不支持读,w方式打开,已存在的文件会被清空 'x' 创建新文件,以只写方式打开 'a' 文件以追加,写方式打开,文件存在,写位置位于文件结尾 'b' 以二进制方式打开,例如:图片,视频等 't' 以文本方式打开,默认方式 '+' 读写方式打开组合方式打开:
参数 说明 'r+' 读写方式打开,读写位置位于开头,原数据保留 'w+' 读写方式打开,已存在的文件会被清空 'a+' 效果同'a'模式,增加读权限 二进制方式:'wb','rb','wb+'...;与上面操作类,需要加b选项 2.3 写入文件,发生了什么使用w方式打开文件并写入汉字:测试
#window下定义文件,使用r字符串 fpath = r'E:\t1.txt' #open函数打开文件,返回文件对象 wds = '测试' f = open(fpath, 'w') f.write(wds) print(f) f.close()
结果:
_io.TextIOWrapper name='E:\\t1.txt' mode='w' encoding='cp936'
结果中可以看到:
文件路径:name 文件权限:w 文件编码格式:cp936,window下默认编码格式, Linux 下一般为utf-8
写入文件内容是什么?1:'测试'的编码格式为unicode,这个编码不能直接写入到f文件, 2:f.write写入时候,将wds进行编码,编码格式为'cp936' 3:编码完成之后,在写入文件; 4:文件写有缓存,写入数据只是到了缓存中;什么时候同步到磁盘? 5:情况1:只有缓存中的数据到了一定数量同步一次; 情况2:调用flush方法强制写; 情况3:调用close方法关闭文件;
2.4 编码格式问题读取上一步写入的文件
#window下定义文件,使用r字符串 fpath = r'E:\t1.txt' #open函数打开文件,只读,编码格式为cp936 f = open(fpath) print(f.read()) f.close()
结果:测试
使用utf-8编码格式打开#window下定义文件,使用r字符串 fpath = r'E:\t1.txt' #open函数打开文件,只读,编码格式为utf-8 f = open(fpath, encoding='utf-8') print(f.read()) f.close()
结果报错:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 0: invalid start byte
纠正:使用文件对应的编码格式打开,window下cp936与gbk等通用;
遇到这种问题:打开文件编码格式与文件自身编码格式不匹配。
3. 文件读取方式
方法 说明 f.read(size=-1, /) 读取指定长度,默认读取完成 f.readline(size=-1, /) 读取size字节,遇到行尾结束, f.readlines(hint=-1, /) 读取文件所有行,返回列表 3.1 遍历文件 方式1 :for 循环遍历,推荐这种方式:#window下定义文件,使用r字符串 fpath = r'E:\test.txt' #open函数打开文件,返回文件对象 f = open(fpath) #逐行遍历文件 for line in f: print(line, end='') f.close()方式2:先将文件全部读出,然后逐行遍历
#window下定义文件,使用r字符串 fpath = r'E:\test.txt' #open函数打开文件,返回文件对象 f = open(fpath) for line in f.readlines(): print(line, end='') f.close()3.2 如何理解:f.readline(size=-1, /) 如果一行数据长度大于size,读取size个返回 如果一行数据长度小于size,读取行尾返回
fpath = r'E:\test.txt' f = open(fpath) #读取3个 print(f.readline(3)) f.close() f = open(fpath) #读取10个 print(f.readline(10)) f.close()
结果:
thi this3.3 文件写入 f.write(text, /):写入text,返回写入长度 f.writelines(lines, /):一次写入多行 f.flush():强制将缓存写入磁盘
文件换行:'\n' 示例:
fpath = r'E:\t2.txt' #open函数打开文件,返回文件对象 wds = '测试' f = open(fpath, 'w') f.write(wds) #换行 f.write('\n') #写入多行 f.writelines([wds+'\n']*2) f.close()
结果:
测试 测试 测试
4. seek操作
一个问题:文件读取之后,如何在次重新读取?
方式1:关闭文件,再次读取 方式2:使用seek操作 f.seek(cookie, whence=0, /):改变文件读写位置, cookie为偏移量 whence为指定位置 whence 说明 0 文件起始位置 1 文件当前位置,window只支持cookie=0 2 文件结尾,window只支持cookie=0读取为例:
fpath = r'C:\Users\hyg\Desktop\data\test.txt' f = open(fpath) #读取3个 line = f.read(3) print(line) #将读取位置设文件开头,向后偏移一个字节 f.seek(1,0) line = f.read(3) print(line) #将读取位置设置到文件结尾 f.seek(0, 2) line = f.read(3) print(line)
结果:
thi his
总结: 文件操作注意点:
打开方式,尤其适用w方式,注意文件会被清空 读写二进制文件,需要使用'rb'或者'wb'方式 读取文件推荐使用for遍历 文件写入注意换行使用'\n'查看更多关于21天学习python编程_文件基本操作的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did170262