第1章 处理文件
处理文件有两种方式,即open(...)和file(...),本质上前者内部调用后者进行文件操作,推荐使用open。
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对文件操作。
文件句柄 = file(‘文件路径‘, ‘模式‘)
1.1 打开文件的模式
r,只读模式(默认)
w,只写模式[不可读,不存在则创建;存在则删除原内容。]
追加模式。[可读;不存在则创建;存在则只追加内容。]
1.1.1 “+”表示可以同时读写某个文件
r+,可读写文件。[可读,可写,可追加]
w+,写读
a+,同a
1.1.2 “U”表示在读取时,可以将\r \n \r\n自动转换成\n(与r或r+模式同时使用)
- rU
- r+U
1.1.3 “b”表示处理二进制文件
例如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需要注。
l rb
l wb
l ab
1.2 操作文件
1.2.1 close() 关闭文件
描 述:就是处理文件后关闭此文件
返回 值:没有任何返回值
1.2.2 fileno() 文件描述符
描 述:文件描述符,可用于底层操作系统的I/O操作。
返回 值:整型的文件描述符(数字,int)
实 例:
#!/usr/bin/env python # 打开文件 fo = open("12.txt", "ab") print ("文件名为: ", fo.name) fid = fo.fileno() print ("文件描述符为: ", fid) # 关闭文件 fo.close() 结 果: 文件名为: 12.txt 文件描述符为: 3
1.2.3 flush() 刷新文件内部缓冲区
描 述:处理完文件,将处理的内容刷新到磁盘。
返回 值:没有任何结果
1.2.4 isatty() 判断文件是否同意tty设备
描 述:检测文件是否连接到一个终端设备。
返回 值:True或False
实 例:
#!/usr/bin/env python # 打开文件 fo = open("1.txt", "wb") print ("文件名为: ", fo.name) ret = fo.isatty() print ("返回值 : ", ret) # 关闭文件 fo.close() 结 果: 文件名为: 1.txt 返回值 : False
1.2.5 next() 获取下一行数据,不存在,则报错
描 述:获取下一行数据,如果不存在就直接报错,这样不可控,一般不会用。
返回 值:没有任何结果。
1.2.6 read() 读取指定字节数据
描 述:方法用于文件读取指定的字节数,如果未给定或为负则读取所有
参 数:size=从文件中读取的字节
实 例:
文件: 1:www.python888.com 2:www.python888.com 3:www.python888.com 4:www.python888.com 5:www.python888.com code: #!/usr/bin/env python # 打开文件 fo = open("12.txt","r+") print ("文件名为: ",fo.name) line = fo.read(20) print ("读取的字符串: %s" % (line)) # 关闭文件 fo.close() 结果: 文件名为: 12.txt 读取的字符串: 1:www.python888.com
1.2.7 readline()仅读取一行
描 述:仅读取一行数据
参 数:size=这是从文件中读取的字节数
实 例:
#只读取一行内容 fo = open("12.txt", "r") print ("Name of the file: ", fo.name) line = fo.readline() print ("Read Line: %s" % (line)) line = fo.readline() print ("Read Line: %s" % (line)) # Close opend file fo.close() 结 果: Name of the file: 12.txt Read Line: 1:www.python888.com Read Line: 2:www.python888.com
1.2.8 readlines() 读取所有数据
描 述:读取所有数据,并根据换行保存值列表
参 数:sizehint=从文件中读取字节数
实 例:
# 打开文件readlines() fo = open("12.txt", "r+") print ("文件名为: ", fo.name) line = fo.readlines() print ("读取的数据为: %s" % (line)) line = fo.readlines() print ("读取的数据为: %s" % (line)) # 关闭文件 fo.close() 结 果: 文件名为: 12.txt 读取的数据为: [‘1:www.python888.com\n‘, ‘2:www.python888.com\n‘, ‘3:www.python888.com\n‘, ‘4:www.python888.com\n‘, ‘5:www.python888.com‘] 读取的数据为: [] 备 注: 如果前边有打印所有数据出来,后面打印任何字节数都没有信息,字节数只能单独使用,如果字节数超过一行的字节说,那么打印整行的第二行。
1.2.9 seek()指定文件中指针位置
描 述:用于移动文件读取指针到指定位置。
参 数:
offset=开始的偏移量,也就是表示需要移动偏移量的字节数
- whence=可选,默认值为0,给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
实 例:
#seek指定中指定位置 # 打开文件 fo = open("12.txt", "r+") print ("文件名为: ", fo.name) line = fo.readline() print ("读取的数据为: %s" % (line)) # 重新设置文件读取指针到开头 fo.seek(2,0) line = fo.readline() print ("读取的数据为: %s" % (line)) # 关闭文件 fo.close() 结 果: 文件名为: 12.txt 读取的数据为: 1:www.python888.com 读取的数据为: www.python888.com
1.2.10 tell() 获取当前指针位置
描 述:获取读取后指针的位置
实 例:
#获取当前指针的位置 # 打开文件 fo = open("12.txt", "r+") print ("文件名为: ", fo.name) line = fo.readline() print ("读取的数据为: %s" % (line)) # 获取当前文件位置 pos = fo.tell() print ("当前位置: %d" % (pos)) # 关闭文件 fo.close() 结 果: 文件名为: 12.txt 读取的数据为: 1:www.python888.com 当前位置: 20
1.2.11 truncate截断数据,仅保留指定之前数据
描 述:截断数据,仅保留指定之前数据
参 数:size=可选,如果存在则文件截断为size字节
1.2.12 write 写内容
描 述:写内容
参 数:str=要写入文件的字符串
实 例:
#writ写内容 # 打开文件 fo = open("12.txt", "r+") print ("文件名为: ", fo.name) str = "老男孩教育" fo.write(‘a123d‘) print(fo.readlines()) # 关闭文件 fo.close() 结 果: 文件名为: 12.txt 文件名为: 12.txt [‘1:www.python888.com\n‘, ‘2:www.python888.com\n‘, ‘3:www.python888.com\n‘, ‘4:www.python888.com\n‘, ‘5:www.python888.comadasdadasd\n‘, ‘adasd\n‘, ‘adasd\n‘, ‘adasdadasda123d‘]
1.2.13 writelines() 将一个字符串表写入文件
描 述:方法用于向文件中写入一序列的字符串。这一序列字符串可以是由迭代对象产生的,如一个字符串列表。换行需要制定换行符 \n。
实 例:
#写入序列到文件 # 打开文件 fo = open("test.txt", "r+") print ("文件名为: ", fo.name) seq = ["chenxin 1", "chenxin 2"] fo.writelines( seq ) print(fo.readlines()) # 关闭文件 fo.close() 结 果: 文件名为: test.txt [‘chenxin 1\n‘, ‘chenxin 2chenxin 1\n‘, ‘chenxin 2‘]
1.2.14 xreadlines 可用于逐行读取文件,非全部
描 述:读取使用ReadLine()并返回包含行的列表直到EOF。如果可选sizehint参数不是读取到达EOF,全行共计约sizehint字节(可能四舍五入到内部缓冲区的大小后)被读取。
返回 值:这个方法返回一个包含行的列表。
实 例:
# Open a file fo = open("12.txt", "r+") print ("Name of the file: ", fo.name) #line = fo.readlines() #print ("Read Line: %s" % (line)) line = fo.readlines(21) print ("Read Line: %s" % (line)) # Close opend file fo.close() 结 果: Name of the file: 12.txt Read Line: [‘1:www.python888.com\n‘, ‘2:www.python888.com\n‘]
1.3 with
为了避免打开文件后忘记关闭,可以通过管理上下文,即
with
open(‘log‘,‘r‘) as f:
.....
如此方式,在with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python2.7后,with又支持同时对多个文件的上下文进行管理,即:
with
open(‘log1‘) as obj1,
open(‘log2‘)
as obj2:
pass
第二章 字符编码
1.在python2默认编码是ASCII, python3里默认是utf-8
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-8就是unicode
3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
2.1 Python2中
utf-8转成gbk s_to_unicode = s.decode(‘utf-8‘) #utf-8转换成unicode s_to_gbk = s_to_unicode.encode("gbk") #unicode转成为gbk gbk_to_utf8 = s_to_gbk.decode(‘gbk‘).encode(‘utf-8‘) #gbk转成utf-8 #utf8是unicode的扩展集,因此utf-8可以直接打印unicode, 在字符串前加u就可以成为unicode,例如:u‘陈鑫‘
2.2 Python3中
#默认就是unicode,python程序本身就是unicode,注意不管文件编码是什么,在python中都是unicode #gbk向下兼容gb2312 #想让文件处理gbk编码是,必须声明为gbk。 #打印会打印出base类型,再decode一下就会变成字符串了。 s = ‘陈鑫‘ #默认为unicode s_to_gbk = s.encode(‘gbk‘) #转换gbk print(‘s_to_gbk‘,s_to_gbk) print(‘utf8‘,s.encode()) gbk_to_utf8 = s_to_gbk.decode(‘gbk‘).encode(‘utf-8‘) #gbk转换为utf-8 print(‘gbk_to_utf8‘,gbk_to_utf8)
2.3 系统默认编码
import sys print(sys.getdefaultencoding())