博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python之读写文本数据
阅读量:4960 次
发布时间:2019-06-12

本文共 2880 字,大约阅读时间需要 9 分钟。

知识点不多

一:普通操作 

# rt 模式的 open() 函数读取文本文件# wt 模式的 open() 函数清除覆盖掉原文件,write新文件# at 模式的 open() 函数添加write新文件with open("../../testData","rt",encoding="utf-8") as f :    for line in f :        print(line)# 写操作默认使用系统编码,可以通过调用 sys.getdefaultencoding() 来得到,也以通过传递一个可选的 encoding 参数给open()函数,几个常见的编码是ascii, latin-1, utf-8和utf-16# 关于换行符的识别问题:在Unix和Windows中是不一样的(分别是 \n 和 \r\n )。 默认情况下,Python会以统一模式处理换行,识别普通换行符并将其转换为单个 \n 字符# 如果你不希望这种默认的处理方式,可以给 open() 函数传入参数 newline=''f =open('somefile.txt', 'rt', newline='')# 最后一个问题就是文本文件中可能出现的编码错误# 如果修改了编码方式之后,编码错误还是存在的话,你可以给 open() 函数传递一个可选的 errors 参数来处理这些错误。m = open('sample.txt', 'rt', encoding='ascii', errors='replace')# 如果你经常使用 errors 参数来处理编码错误,也是不好的。# 原则是确保你总是使用的是正确编码。当模棱两可的时候,就使用默认的设置(通常都是UTF-8)。
二:打印输出至文件中
with open('../../testData', 'at') as f:    print('Hello python!', file=f)# 使用其他分隔符或行终止符打印# 使用 print() 函数输出数据,但是想改变默认的分隔符或者行尾符,使用sep  endprint("hello","cool","zzy",sep="***",end="!")   # hello***cool***zzy!#使用  str.join()print("***".join(("hello","cool","zzy")))  # hello***cool***zzy# 对比row = ("hello","cool","zzy")print(*row,sep="***")   # hello***cool***zzy
三:读写字节数据
# 读写二进制文件,比如图片,声音文件,使用模式为 rb 或 wb 的 open() 函数# 在读取二进制数据的时候,字节字符串和文本字符串的语义差异可能会导致一个潜在的陷阱:索引和迭代动作返回的是字节的值而不是字节字符串a='Hello World'print(a[0])   # Hb = b'Hello World'  # Byte stringprint(b[0])  # 72  索引和迭代动作返回的是字节的值而不是字节字符串# 如果你想从二进制模式的文件中读取或写入文本数据,必须确保要进行解码和编码操作# 解码with open("../../testDta","rb") as f :    data=f.read(16)    text=data.decode("utf-8")# 编码with open("../../testDta","wb") as d :    text="hello"    f.write(text.encode("utf-8"))
四:文件不存在才能写入
一个替代方案是先测试这个文件是否存在,像下面这样:
import osif not os.path.exists("../../testData"):    with open("../../testData", "wt") as f:        f.write("")else:    print('File already exists!')
最优解决
# 文件中写入数据,不允许覆盖已存在的数据,可以用"xt",这个参数会判断文件是否已经存在(不管是否有内容,也不管内容是怎样的),如果有会报错FileExistsError:with open("../../testData","wt") as f :    f.write("")with open("../../testData","xt") as f :    f.write("你好")    # FileExistsError: [Errno 17] File exists: '../../testData'
五:读压缩文件
import gzipwith gzip.open('somefile.gz', 'rt') as f:    text = f.read()# bz2 compressionimport bz2with bz2.open('somefile.bz2', 'rt') as f:    text = f.read()# 写入压缩数据import gzipwith gzip.open('somefile.gz', 'wt') as f:    f.write(text)# bz2 compressionimport bz2with bz2.open('somefile.bz2', 'wt') as f:    f.write(text)
读写压缩数据  如果你不指定模式,那么默认的就是二进制模式,如果这时候程序想要接受的是文本数据,那么就会出错。 gzip.open() 和 bz2.open() 接受跟内置的 open() 函数一样的参数, 包括 encoding,errors,newline 等等。 可以使用 compresslevel 这个可选的关键字参数来指定一个压缩级别,默认的等级是9,也是最高的压缩等级。等级越低性能越好,但是数据压缩程度也越低。
with gzip.open('somefile.gz', 'wt', compresslevel=5) as f:    f.write(text)

 

六:固定大小记录的文件迭代
from functools import partialRECORD_SIZE= 32# somefile.data是二进制文件with open('somefile.data', 'rb') as f:    records = iter(partial(f.read, RECORD_SIZE), b'')    for r in records:        ...

 

 

 

 

转载于:https://www.cnblogs.com/zzy-9318/p/10497428.html

你可能感兴趣的文章
在SQLServer 2005附加SQLServer 2008数据库异常处理
查看>>
网易新闻侧滑抽屉效果(利用父子控制器实现)
查看>>
Ceph:pg peering过程分析
查看>>
4.高级特性(1)
查看>>
【读书笔记】【独立思考】2018-04-14
查看>>
初始化
查看>>
Piggy-Bank(复习完全背包)
查看>>
mongoDb 给表添加+ 删除字段
查看>>
关情纸尾-----OC-Foundation框架中常用的类
查看>>
.net mvc 防止 xss 与 CSRF
查看>>
git-02 下载代码
查看>>
qsort 的用法
查看>>
004--面试之ES6其他常用的功能
查看>>
CURL方式使用代理访问网站
查看>>
php中面向对象的概念
查看>>
npm 更新及做淘宝镜像
查看>>
react:高阶组件wrappedComponent
查看>>
vue: data binding
查看>>
基本控件文档-UIButton属性---iOS-Apple苹果官方文档翻译
查看>>
one2many &&many2many
查看>>