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 已存在,无法创建)

python——文件处理的更多相关文章

  1. Linux下Python 文件内容替换脚本

    Linux下Python 文件替换脚本 import sys,os if len(sys.argv)<=4: old_text,new_text = sys.argv[1],sys.argv[2 ...

  2. 【Python文件处理】递归批处理文件夹子目录内所有txt数据

    因为有个需求,需要处理文件夹内所有txt文件,将txt里面的数据筛选,重新存储. 虽然手工可以做,但想到了python一直主张的是自动化测试,就想试着写一个自动化处理数据的程序. 一.分析数据格式 需 ...

  3. Python文件使用“wb”方式打开,写入内容

    Python文件使用"wb"方式打开,写入字符串会报错,因为这种打开方式为:以二进制格式打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. 所以写入 ...

  4. Python 文件操作函数

    这个博客是 Building powerful image classification models using very little data 的前期准备,用于把图片数据按照教程指示放到规定的文 ...

  5. python文件I/O(转)

    Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你 ...

  6. python 文件操作总结

    Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你 ...

  7. Python基础篇【第2篇】: Python文件操作

    Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...

  8. python文件和元组

    python文件操作 相较于java,Python里的文件操作简单了很多 python 获取当前文件所在的文件夹: os.path.dirname(__file__) 写了一个工具类,用来在当前文件夹 ...

  9. Python文件基础

    ===========Python文件基础========= 写,先写在了IO buffer了,所以要及时保存 关闭.关闭会自动保存. file.close() 读取全部文件内容用read,读取一行用 ...

  10. python文件打包格式,pip包管理

    1..whl是python文件的一种打包格式, 在有些情况下,可以将文件的后缀名改为.zip并解压 2.cmd中,提示pip版本太低,先升级pip   pip install --upgrade pi ...

随机推荐

  1. APP测试总结2

    一.App测试流程与web项目流程区别 1.对UI要求比较高,需要更加注重用户体验.对于一个小小的屏幕,如何让用户使用更加轻便.简介.易用. 2.App是调用服务端接口展示数据.我们测试需要可以判断问 ...

  2. Python import搜索路径相关

    import搜索路径 在当前目录下搜索该模块 在环境变量 PYTHONPATH 中指定的路径列表中依次搜索 在 Python 安装路径的 lib 库中搜索 查看当前的搜索路径 import sys p ...

  3. Selenium打开IE报错“Protected Mode settings...”解决方法

    最近在使用Selenium打开IE浏览器碰到以下报错:

  4. [转]理解js中的原型链,prototype与__proto__的关系

    本文转自:http://rockyuse.iteye.com/blog/1426510 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script typ ...

  5. Sphinx Building Docs in horizon

    Building Contributor Documentation This documentation is written by contributors, for contributors. ...

  6. 网站启用GZip压缩后,速度快了3倍!

    GZip压缩,是一种网站速度优化技术,也是一把SEO优化利器,许多网站都采用了这种技术,以达到提升网页打开速度.缩短网页打开时间的目的. 本文是一篇研究性文章,将通过某个案例来给大家显示网站采用GZi ...

  7. 深入理解.net remoting 与webservice

    1. .NET Remoting .NET Remoting是微软随.NET推出的一种分布式应用解决方案,被誉为管理应用程序域之间的 RPC 的首选技,它允许不同应用程序域之间进行通信(这里的通信可以 ...

  8. Android开发之——依赖冲突Program type already present

    前言 实际开发中,为了提高开发速度和效率,总避免不了引用第三方提供的依赖和类库,如果含有相同依赖的类库被我们引用时,而他们的版本又不相同,就有可能会导致一系列问题和异常,本文结合本人时间总结和他人经验 ...

  9. 【Node.js】Stream(流)的学习笔记

    最近学习使用Node.js创建http proxy server,少不了要跟Stream打交道.昨天开始查阅一些资料,多少有了一些粗浅了解.整理在这里,供学习之用. 从Node.js API文档中可知 ...

  10. Java—包装类、Date和SimpleDateFormat、Calendar类

    包装类 基本数据类型不能调用方法,功能简单,为了让基本数据类型也具备对象的特性,Java为每个基本数据类型提供了一个包装类,这样就可以像操作对象那样来操作基本数据类型. 基本类型和包装类之间的对应关系 ...