1.文件处理

f = open(file="file01.txt", mode="r", encoding="utf-8") #python3默认编码格式为utf-8
data = f.read()
print(data)
print(type(data)) # <class 'str'>
f.close()

如果报错

#UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 0: invalid continuation byte

说明编码不对。

按正常逻辑来讲,文件是以什么方式存的,就应该用什么方式去读取,比如以gb2312存的,就应该以gb2312去读。文件是以utf-8存的,就用utf-8的编码格式去读。


2.文件处理-二进制模式

文件在计算机中是以二进制存储的,我们可以不理会编码,直接以二进制的形式读取文件内容

f = open(file="file01.txt", mode="rb")
data = f.read()
print(data)
f.close()

以二进制方式读取, mode = "rb" ,得到的结果也是二进制。

在读取视频、图片等内容和网络传输的时候,会使用二进制方式读取。

 #打印结果 b'\xef\xbb\xbf\xe7\x94\xb0\xe7\xbb\xb4\xe9\x80\x9a\t12001\t10\r\n\xe5\xbc\xa0\xe5\xae\xb6\xe9\x93\xad\t12002\t11\r\n\xe8\x88\x92\xe5\xa8\x85\t12003\t12\r\n\xe5\xad\x99\xe7\x8e\x89\xe5\x80\xa9\t12004\t13\r\n\xe5\xbc\xa0\xe8\xb6\x85\t12005\t14\r\n\xe7\x8e\x8b\xe4\xba\xac\t12006\t15\r\n\xe5\xbb\x96\xe6\x9e\x97\xe8\x8b\xb1\t12007\t16\r\n\xe5\xbe\x90\xe6\x99\x93\xe8\x8e\x89\t12008\t17\r\n\xe9\x87\x91\xe5\x98\x89\xe7\xa5\xba\t12009\t18\r\n\xe5\x8f\x8a\xe6\xa0\xbc\t12010\t19\r\n\xe4\xba\x8e\xe5\x87\xaf\xe9\x98\xb3\t12011\t20\r\n\xe6\x9d\x8e\xe4\xbf\x8a\xe7\xba\xa2\t12012\t21\r\n\xe5\x88\x98\xe5\x86\xac\t12013\t22\r\n'

3.文件处理-智能检测编码的工具

import chardet
f = open('file01.txt', mode="rb")
data = f.read()
print(chardet.detect(data)) #打印结果:
#{'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
#confidence,表示 encoding 为 UTF-8-SIG 的概率为 1.0

然后,当我们知道目标文件是什么格式后,data.decode("utf-8") 一下,就可以打印出我们需要的内容


4. 循环读取逐条读取文件

f = open('file01.txt', 'r', encoding='utf-8')
for line in f:
print(line, end="") # end = "" 表示,打印的时候以什么结尾,此处可以去掉print默认的换行符 \n
f.close()

打印结果:

# 田维通	12001	10
# 张家铭 12002 11
# 舒娅 12003 12
# 孙玉倩 12004 13
# 张超 12005 14
# 王京 12006 15
# 廖林英 12007 16
# 徐晓莉 12008 17 ...

5.写文件

#以 gbk 格式创建一个文件,写入内容“将进酒”
f = open(file='file02.txt', mode='w', encoding='gbk')
f.write('将进酒')
f.close()

如果这个时候再写一遍,即

f = open(file='file02.txt', mode='w', encoding='gbk')
f.write('杯莫停')
f.close()

得到的结果是:将原来的 file02.txt 文件覆盖掉了


6.写文件——追加

写入内容追加的已有内容后面

f = open('file02.txt', 'ab')  #mode 为 ab 或 a,表示追加
f.write('\n人生得意须尽欢'.encode('gbk'))
f.close()


7.文件处理-读写混合操作文件

f = open('file02.txt', 'r+', encoding='gbk')
data = f.read()
print("content:", data)
f.write("\n锄禾日当午")
f.write("\n汗滴禾下土")
f.write("\n离离原上草")
f.write("\n一岁一枯荣")
f.close()

结果:


8.文件操作的其他功能

(1)flush()

f = open('f_flush.txt', 'w', encoding='utf-8')
f.write('奇门遁甲') # 在f.close() 之前,写入的内容是在内存中的,而且可能此时txt文件里是没有内容的,所以可以加一句 f.flush(),把文件强制从内存buffer里刷新到硬盘
#一般内存里的buffer满了会自动刷新到硬盘,但是使用 f.flush() 可控制强制刷新到硬盘
f.close()

(2)tell() seek()

# 文本内容: hello world!
>>> f = open('file03.txt', 'r', encoding='gbk')
>>> f.tell() #返回当前文件操作光标位置
0
>>> f.seek(1) # 把操作文件的光标移到指定位置
1
>>> f.read()
'ello world!'

注意:tell(), seek()找的都是字节,长度都是按字节算的。另外,每个字符在不同编码格式下所占的字节长度不一样,gbk 一个中文占2个字节,utf-8 一个中文占3个字节

以中文为例:

# 文件内容:技高一筹
>>> f = open("file03.txt",'r',encoding='gbk')
>>> f.read()
'技高一筹'
>>> f.tell()
8
>>> f.seek(0) #把文件光标移动到起点 0
0
>>> f.seek(4) #把文件光标移动到 4,此时,gbk 下,一个汉字占2个字节,此时光标的位置在 技高和一筹之间
4
>>> f.read() # 所以,读取结果为 后两个字
'一筹'
>>>
#-----------------------------------------------------------------------------
>>> f.seek(1) #把文件光标移动到 1,“半个字”,此时读取内容不出问题,因为他只拿到了 技 字的一部分字节,打印会报错
1
>>> f.tell()
1
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0xef in position 6: incomplete
multibyte sequence

(3)seekable() 判断文件是否可进行seek操作,readable() 判断文件是否可读,writable()判断文件是否可写

(4) truncate() 按指定长度截断文件

#文件内容: 技高一筹
>>> f = open("file03.txt",'r+',encoding='gbk')
>>> f.seek(2)
2
>>> f.truncate()
2
>>> f.read() #文件内容 只剩一个 “技” 字

truncate(4)指定长度的话,就从文件开头开始截取指定长度。不指定长度的话,就从当前位置到文件尾部的内容全去掉。

#文件内容: 技高一筹
>>> f = open("file03.txt",'r+',encoding='gbk')
>>> f.tell()
0
>>> f.truncate(4) #文件内容 只剩一个 “技高” 字

9. 实现文件内容的修改

import os
f = open('file05.txt', 'r+', encoding='gbk') #打开file05.txt 文件
f_new = open('file05_new.txt', 'w', encoding='gbk') # 创建一个新文件 old_str = '李四'
new_str = '李云龙'
for line in f:
if old_str in line: #逐行读取
line = line.replace(old_str, new_str) #修改文件中的内容
f_new.write(line) # 逐行读取的内容写到新创建的文件中
f.close()
f_new.close() os.replace('file05_new.txt', 'file05.txt') # 替换,以达到修改文件内容的目的(window用os.replace()可实现,但是使用os.rename()不可以,会报错,提示 file05.txt 已存在,无法创建)

最新文章

  1. RoboGuice 3.0 (二)进阶篇
  2. MySQL 联合索引详解
  3. [LeetCode] Binary Tree Level Order Traversal 2
  4. ylbtech-dbs:ylbtech-6,record(生活记录)
  5. Linux下配置xampp
  6. asp.net 配置 X-Frame-Options
  7. 打包python脚本为exe可执行文件-pyinstaller和cx_freeze示例
  8. 【转载】总结一下Android中主题(Theme)的正确玩法
  9. device tree website
  10. 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用
  11. javascript 函数 add(1)(2)(3)(4)实现无限极累加 —— 一步一步原理解析
  12. SQL优化工具
  13. Web service request SetParameters to Report Server http://host/reportserver failed. Error: 请求因 HTTP 状态 401 失败: Unauthorized
  14. 第4章 简单的C程序设计——选择结构程序设计
  15. Eclipse中tomcat启动时报jar包 it&#39;s not a class错误;
  16. jquery花式图片库——jqFancyTransitions
  17. 二叉树的python可视化和常用操作代码
  18. 使用ES6的Promise完美解决回调地狱
  19. QT 遇到的问题
  20. A1023. Have Fun with Numbers

热门文章

  1. 3d Max 2010安装失败怎样卸载3dsmax?错误提示某些产品无法安装
  2. 性能测试工具Jmeter01-简介
  3. OpenStack Weekly Rank 2015.07.27
  4. (转) tcpdump参数解析及使用详解
  5. DEDE列表页和内容页调用顶级栏目ID的方法
  6. windows中的ubuntu
  7. MyBatis01--------概念
  8. Git如何解决冲突
  9. ArcGIS 10.2之地图服务的发布、使用
  10. SpringCloud的学习记录(4)