7.1 Python处理txt文件:open
在Python中,通过open函数可以打开一个文件,创建一个file对象,然后对该对象进行读写。
函数语法:
open(name[, mode[, buffering]…])
参数说明:
name:文件名
mode:文件打开的模式:只读,写入,追加等。这个参数是非强制的,默认文件访问模式为只读®。常见的模式及其说明如下:
模式 | 操作 | 文件不存在 | 是否覆盖 |
---|---|---|---|
r | 只读 | 报错 | - |
r+ | 读写 | 报错 | 是 |
w | 只写 | 创建 | 是 |
w+ | 读写 | 创建 | 是 |
a | 只写 | 创建 | 否,追加写 |
a+ | 读写 | 创建 | 否,追加写 |
buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
encoding:指定的编码格式
file 对象方法:
file.read([size]):size 未指定则返回整个文件,读到文件尾时返回空字串。
file.readline():返回一行。
file.readlines([size]) :返回包含size行的列表, size 未指定则返回全部行。
f.write(“hello\n”):如果要写入字符串以外的数据,先将他转换为字符串。
f.tell():返回一个整数,表示当前文件指针的位置(就是到文件头的字节数)。
f.seek(偏移量,[起始位置]):用来移动文件指针。
偏移量: 单位为字节,可正可负
起始位置: 0 - 文件头, 默认值; 1 - 当前位置; 2 - 文件尾
f.close() 关闭文件
7.1.2 打开txt文件并读取内容
1、我们先新建一个txt文本文件,写入内容如下:
离离原上草,一岁一枯荣。
野火烧不尽,春风吹又生。
2、保存该文件,以GBK
编码方式。下图中的ANSI编码指的是当地的默认编码,在中国就是GBK
。
3、一般我们是通过上下文管理器来打开文件的,这样就可以避免忘记手动关闭文件。我们可以通过下面的代码读取并输出txt内容:
with open('test.txt') as f:
print(f.read())
离离原上草,一岁一枯荣。
野火烧不尽,春风吹又生。
这种打开的方式,并没有指定encoding
编码,默认使用GBK
打开。如果txt文件默认的是GBK则可以正常打开,否则会报错。我们将之前的txt文件的编码改成utf-8
后则报错如下:
Traceback (most recent call last):
File “E:\Syncdisk\PythonFiles\t5.py”, line 2, in
print(f.read())
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xa6 in position 4: illegal multibyte sequence
这个时候,我们就可以指定open函数中的encoding参数,如下:
with open('test.txt', encoding='utf-8') as f:
print(f.read())
那么现在又有个新问题了,对于不知道txt文件编码格式的,我们怎么打开呢?总不可能每次都手动打开txt文件,查看编码格式之后再调用open函数来打开吧。
这里我们可以通过检测编码,得到编码后再通过检测到的编码格式解码结果:
from chardet import detect
def myread(fn):
with open(fn, mode='rb') as f:
Bytes = f.read()
encode = detect(Bytes)['encoding']
if encode:
if encode.lower() in ['gbk', 'gb2312']:
return Bytes.decode('GB2312', 'ignore')
elif encode.lower() in ['utf-8-sig']:
return Bytes.decode('utf-8-sig', 'ignore')
else:
return Bytes.decode('utf-8', 'ignore')
print(myread('test.txt'))
离离原上草,一岁一枯荣。
野火烧不尽,春风吹又生。
7.1.3 将文本写入到txt文件中
with open('test.txt', mode='w+') as f:
f.write("""
i love python
i love python
i love python
""")
f.seek(0) # 这里需要将文件指针指向文件头,否则下面的read函数无法读取文件。
print(f.read())
i love python
i love python
i love python