在python中文件的读写操作应该的十分广泛。比如,我们经常会读取txt获取一些信息,用来参数化操作。当热不局限于这些,关于文件读写方面的知识有很多,说一天可能都说不完,但是我们今天呢?主要跟大家分享的是python的文件读写中一些比较实用、我们经常用的知识。来开始表演吧~~~~
在python如如何创建一个文件呢?我们可以使用open()函数,这个函数里面有很多的参数,看一下它的基本机构:
open(name[, mode[, buffering]])
name : 一个包含了你要访问的文件名称的字符串值。
mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
这里面我可以简单点理解就是:open(文件路径,打开方式) 至于buffering的值我们可以先不管,以后再说。在使用open函数时,我们还需要知道一件事情,就是关于文件常用的读写方法有哪些?我们来介绍一下:
读文件:
read(N byes) 读取N个字节数
readline() 默认读取第一行,数组的形式返回
readlines() 读取所有行内容,数组的形式返回
写文件:
write() 直接写入内容 writelines() 直接向文件中写入序列字符串 换行使用 \n
a 追加文件
1.我们先用open函数创建一个文件命名为demo.py w:写模式打开文件,写模式会覆盖原文件内容,如果文件不存在则创建
filename = open(‘test.txt‘,‘w‘)
filename.write(‘www.baidu.com’)
filename.close()
代码解析:
1).我们使用open函数创建一个test.txt文件,我们使用的是写(w)模式创建的,这个很重要,不然无法创建文件
2).我们使用write方法向text.txt文件中写入www.baidu.com内容
3).close()用来关闭文件,文件不关闭就没有真正提交到内存中。
输出结果:
因为没有指明具体的存储路径,所以默认创建的文件是和demo.py文件在一起的。
打开文件看下内容:
看看,www.baidu.com是不是被写入到了test.txt文件中了呢?
补充一下:我们使用writelines把序列对象写入txt文本。
#写文件
f = open(‘tex.txt‘,‘w‘)
f.writelines([‘python‘,‘java‘,‘php‘])
f.close()
#读文件 我们使用的是readlines 下面还会有具体的介绍
f = open(‘tex.txt‘,‘r‘)
print f.readlines()
输出结果:
[‘pythonjavaphp‘]
温馨提示:writelines()只能将序列写入文件中,不是序列是会报错的,我看一个报错的例子。
f = open(‘tex.txt‘,‘w‘)
f.writelines([1,234,‘php‘])
f.close()
f = open(‘tex.txt‘,‘r‘)
print f.readlines()
我们把刚才的python换成了常量 1,234 看一下输出的结果:
File "E:/Project_case/demo.py", line 79, in <module>
f.writelines([1,234,‘php‘])
TypeError: writelines() argument must be a sequence of strings
程序是不是报错了呢~~~切记!!!
2.我们如何读取文件中的内容呢?读取文件的方式是读(r)模式,来看下刚才的例子。
#读文件
filename = open(‘test.txt‘,‘w‘)
filename.write(‘www.baidu.com‘)
filename.close()
#写文件
read_file = open(‘test.txt‘,‘r‘)
result = read_file.read()
print result
代码解析,我们写文件使用的是open函数,模式采用的是r(读模式),读取的方式是read()默认读取全部内容。输出结果如下:
www.baidu.com
在看看使用readlines的读取结果呢?
#读文件
filename = open(‘test.txt‘,‘w‘)
filename.write(‘www.baidu.com‘)
filename.close()
#写文件
read_file = open(‘test.txt‘,‘r‘)
result = read_file.readline()
print result
也是读取第一行,因为test.txt文件中只有一行内容。而readline默认只读一行内容。我们继续看看使用readlines读取文件的结果是怎么样的?这回我们在test,txt文件中多加几行内容。我们复制了7次www.baidu.com,然后使用readlines读test.txt文件,看下面的代码:
#读文件
read_file = open(‘test.txt‘,‘r‘)
result = read_file.readlines()
print result
输出结果如下:
[‘www.baidu.com\n‘, ‘www.baidu.com\n‘, ‘www.baidu.com\n‘, ‘www.baidu.com\n‘, ‘www.baidu.com‘]
将所有内容存储到列表中返回出来给我们。但是又一个\n太恶心了为啥呢?因为我们每一行的内容读完以后都进行了换行的操作,直接把换行符打印出来了。拿能不能去掉这个该死的\n呢?答案是当然可以了。继续往下看:
#读文件
read_file = open(‘test.txt‘,‘r‘)
result = read_file.readlines()
for i in result:
print i.strip(‘\n‘)
strip函数的作用是将取出来的内容去掉换行符操作。输出结果如下:
www.baidu.com
www.baidu.com
www.baidu.com
www.baidu.com
www.baidu.com
3.向文件中追加内容,使用a模式,这种方式不会覆盖文件原来内容。首先我们要有存在的内容。来看一端代码小片段:
#读文件
#test.txt文件中是有内容的,我们在此基础上继续追加内容。
read_file = open(‘test.txt‘,‘a‘)
read_file.write(‘zhangshan‘ + ‘lishi‘ + ‘meiguo‘)
read = open(‘test.txt‘,‘r‘)
print read.readlines()
输出结果如下:
[‘welcome to china‘,‘zhangshanlishimeiguo‘]
4.换行在尾部追加内容如下:
read_file = open(‘test.txt‘,‘a‘)
read_file.write(‘\n‘ + ‘zhangshan‘ + ‘lishi‘ + ‘meiguo‘)
read = open(‘test.txt‘,‘r‘)
print read.readlines()
输出结果:
[‘\n‘, ‘zhangshanlishimeiguo‘]
5.如果我们打开一个不存的文件,系统会抛出错误。看如下代码:
read = open(‘abc.txt‘,‘r‘)
print read.readlines()
输出报错信息如下:
Traceback (most recent call last):
File "E:/Project_case/demo.py", line 79, in <module>
read = open(‘abc.txt‘,‘r‘)
IOError: [Errno 2] No such file or directory: ‘abc.txt‘
6.我们看一下文件的内建属性
file()方法 用于新建文件(和open作用一样)
.name()方法 用来获取文件名字
.closed() 检查文件是否关闭成功 成功返回True 错误返回False
.close()方法 关闭文件
代码实例:
fn = file(‘t1.txt‘,‘w‘) 新建文件
fn.write(‘asdf‘) 写入asdf
f = open(‘t1.txt‘,‘r‘) 读取文件
print f.closed 检查是否成功关闭
print f.readlines() 打印所有行数
运行结果:
False
[‘asdf‘]
7.不需要检查文件关闭的读写文件方法:
with open(‘test1.txt‘,‘w‘) as f:
f.write(‘hellozhongguo‘)
f.close()
print f.closed
返回结果:
True
我们使用with open(文件名,‘读写方式’) as f:的方式进行创建文件在读取文件。
源码实例:
#创建文件
with open(‘test1.txt‘,‘w‘) as f:
f.write(‘hellozhongguo‘)
f.close()
print f.closed
#读取文件
with open(‘test1.txt‘,‘r‘) as f:
read_type = f.readlines()
print read_type
输出结果:
True
[‘hellozhongguo‘]
我们继续来一个例子加深对第二种方式的理解:
from datetime import datetime
#写文件
with open(‘test.txt‘, ‘w‘) as f:
f.write(‘今天是 ‘)
f.write(datetime.now().strftime(‘%Y-%m-%d‘))
使用datetime获取当前时间,并且写入到文件中,然后进行文件的读取。
#读文件
with open(‘test.txt‘, ‘r‘) as f:
s = f.read()
print(‘open for read...‘)
print(s)
输出结果:
open for read...
今天是 2018-01-13
这样的读写文件方式对比第一种的读取方式是不是更简单、方便呢?
8.文件读写中有关读取二进制文件的使用方法
二进制文件指定的图像、视频、包括.html格式的网页等等,那么如何使用文件读写的读取他们呢?首先我们要知道读取二进制的方式是‘wb’模式。比如我们打开一个二进制的文件一个本地的hello.jpg格式的文件。
#打开一个二进制文件
with open("E:\\Project_case\\Python_Base\\Read_file\\hello.jpg1",‘rb‘) as f:
a = f.read()
print a
返回的结果是一大堆乱码。当热,我们这里只是介绍读二进制文件的这种方式。
9.读取文件中的编码设置问题
9.1)如果保存的txt文件格式为 ASN 格式的 可以通过下面的方法 输出中文内容:
with open("123.txt",‘rb‘) as f:
s = f.read().decode(‘gbk‘)
print s
代码解析:
1. rb 用于读取文件当然换成 r 模式也是可以的
2. .decode(‘gbk‘)方式用于保证中文正常输出,因为windows的编码是GBK
3.打印文件内容
查看结果:
非Ascii码文件
1)ANSI是默认的编码方式。对于英文文件是ASCII编码
对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。
如果每次都这么手动转换编码嫌麻烦(写程序怕麻烦是好事,不怕麻烦就会写出又长又难懂又没法维护的代码),
Python还提供了一个codecs模块帮我们在读文件时自动转换编码,直接读出unicode:
9.2)如何我们把txt文件的保存格式设置成 ‘utf-8’的格式,那么写法上就和上面的大有不同了。先把txt保存文件改成 (“utf-8”)然后进行读取文件中文字符。
然后使用代码进行输出:
#读取文件保存为utf-8格式的
with open("abc.txt",‘rb‘) as f:
s = f.read().decode(‘utf-8‘)
print s
输出结果如下:
今天是21:00
UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
关于文件读写内容,我们先介绍到这里。