# 文件处理
from os import path
'''
文件的处理包括读文件和写文件,读写文件就是请求操作系统打开一个文件,然后通过
操作系统提供的接口从这个文件对象中读取数据,或者把数据写入这个文件对象(写文件)
'''
# 1.文件的读取
'''
文件读取可分为以下步骤:
打开文件
读取文件内容
关闭文件
打开文件要使用open内建函数
open(file[,mode='r',encoding=None,errors=None])
参数说明: file:文件路径,可以是相对路径和绝对路径
mode:文件打开模式
encoding:文件编码方式,不用于二进制文件,一般是utf-8,gbk
errors:指定如何处理编码和解码错误,适用于文本文件
返回值:一个可迭代的文件对象
mode
r ==> 只读
w ==> 只写,写之前会清空文件的内容,如果文件不存在,会创建新文件
a ==> 追加的方式,在原本内容中继续写,如果文件不存在,则会创建新文件
r+ ==> 可读可写
w+ ==> 打开一个文件用于读写。如果文件存在则将其覆盖。如果文件不存在,创建新文件
a+ ==> 打开一个文件用于读写。如果文件已经存在,文件指针将会放在文件的结尾。文件
打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
b ==> rb,wb,ab,rb+,wb+,ab+意思和上面一样,用于操作二进制文件
二进制文件一般用于视频,音频,图片。
读取文件常用函数
函数
read([size]) ==> 读取文件(读取size字符,默认则是读取全部)
readline([size]) ==> 读取一行,如果指定size,将读入指定的字符数
readlines() ==> 把文件内容按行全部读入,返回一个包含所有行的列表
fp = open(path.dirname(path.abspath(__file__)) + '\\test','r+',encoding='utf-8')
fp.write(',里斯爱上王五')
print(fp.readlines())
fp.close()
文件读写时有可能会产生IOError,一旦出错,最后的fp.close()就不会调用。
为了保证是否出错都能正确的关闭文件,可以使用try...finally来实现
try:
fp = open(path.dirname(path.abspath(__file__)) + '\\test','r+',encoding='utf-8')
print(fp.readlines())
finally:
fp.close()
可以简写为:
with open(path.dirname(path.abspath(__file__)) + '\\test','r+',encoding='utf-8') as fp:
print(fp.readlines())
read()和readlines()会一次读入文件全部内容,如果文件太大,会直接耗尽内存,
因为文件对象可迭代,所有可以使用for-in遍历文件
with open(path.dirname(path.abspath(__file__)) + '\\test','r+',encoding='utf-8') as fp:
for line in fp:
print(line.strip())
注意⽆论是read、readline、readlines都会读⼊⾏末的\n,所以需要⼿动剔除\n
'''
# 2.写文件
'''
path = path.dirname(path.abspath(__file__)) + '\\test','r+',encoding='utf-8'
1.打开文件
f = open(path,'w',encoding='utf-8')
2.写入内容,将内容写入到缓冲区
不会自动换行,需要换行,需要在字符串末尾添加换行符
f.write('里斯和张三是好朋友\n')
3.刷新缓冲区
f.flush() ==> 加速数据流动,保证缓冲区的流畅
4.关闭文件
f.close()
'''
# 3.移动文件指针
'''
文件的顺序是向后读写的,如果想要移动文件指针,可以使用seek方法:
file_obj.seek(offset,whence=0)
功能:移动文件指针
参数:offset是偏移量,正数表示从文件开头向文件末尾移动,负数相反
whence:文件指针位置,可选参数
SEEK_SET or 0表示文件开头位置。默认值
SEEK_CUR or 1表示当前位置
SEEK_END or 2文件末尾位置
with opem(path.dirname(path.abspath(__file__)) + '\\test','r+',encoding='utf-8') as fp:
fp.seek(5) ==> 向后移动5个指针
print(fp.read(3))
fp.seek(0) ==> 回到开头
print(fp.read(5))
print(fp.tell()) ==> tell()显示当前指针的位置
'''
# CSV文件处理
'''
读取CSV
import csv
with open(path.dirname(path.abspath(__file__)) + '\\test2','r+',encoding='utf-8')
csv_reader = csv.reader(fp,delimiter=";") ==> delimiter指定分隔符
header = next(csv_reader) ==> 获取第一行
print(header)
for line in csv_reader:
print(line)
写入csv
import csv
list1 = ['1','2','3',['4','5']]
with open(path.dirname(path.abspath(__file__)) + '\\test2','r+',newline='',encoding='utf-8') as f
csv_writer = csv.writer(f,delimiter='\t')
for line in list1:
csv.writer.writerow(line)
'''