文本文件处理
常见的文本文件有:①txt;②csv,excel;③json,yaml,xml;④ini。->str,list,dict
序列化和反序列化。写入和读取。
文件读取步骤:①打开文件;②写入数据;③关闭文件;④打开文件;⑤读取文件;⑥关闭文件。(外部交互需要关闭)
相关库/模块/函数:with+open,csv,json,yaml,xlrd+xlwt+xlutils,configparser,其它:openpyxl。
with+open+as:获取一个file对象。并不是所有文件都是要进行这个操作。如:josn.load(file_obj) 如:xlrd.open_wordbook(file_path)。
写入操作:yaml和json直接写入dict即可。txt和csv支持w和a两种编辑模式,逐行写入。ini通常不用改。xls特殊格式,修改需要在copy的基础上进行修改,,逐行或指定cell。
1.txt 文本
txt是文本文件,无特殊标记,可直接读取。(数据之间的流转需要注意编码格式)
write方法写入文件时,如果文件不存在会自动创建
mode:a和w。w是指向文件开头,不保留原数据。a是指向结尾,保留原数据。
import random import string # 读取全部 def txt_read(fp=TXT_FILE): with open(fp, mode='r', encoding='utf-8') as f: return f.read(-1) # 逐行读取(需要去掉txt末尾的换行符) def txt_readline(fp=TXT_FILE): with open(fp, mode='r', encoding='utf-8') as f: for line in f.readlines(): yield line.strip() # 写入全部 def txt_write(fp=TXT_FILE): with open(fp, mode='w', encoding='utf-8') as f: s = ''.join([random.choice(string.ascii_letters + string.digits) for _ in range(10)]) f.write(s) # 逐行写入文件(需要在每行末尾加上换行符) def txt_writeline(fp=TXT_FILE): with open(fp, mode='w', encoding='utf-8') as f: li = [random.choice(string.ascii_letters + string.digits) + ' ' for _ in range(10)] f.writelines(li)
2.yaml,json文件
yaml和json,key不可重复。同key不同value,可以使用数组记录。python中的tuple和list都会转化为文件中的数组类型。
yaml和json有特殊的格式和标记符号。需要使用专门的工具进行解析。
yaml和json对应着python里的dict。json为空时读取会抛出异常,并不会返回None。yaml为空时读取会返回None,不会抛出异常。
json操作
json标准编写格式。{"key":["value", true, 100, null]}
#! coding=utf-8 import json import logging import sys logging.basicConfig(level=logging.DEBUG, stream=sys.stdout) # 读取json->dict def json_read(fp=JSON_FILE): with open(fp, mode='r', encoding='utf-8') as f: data = json.load(fp=f) logging.debug(r'{}-->{}'.format(fp, data)) return data # 写入dict->json def json_write(data, fp=JSON_FILE): with open(fp, mode='w', encoding='utf-8') as f: json.dump(data, fp=f, ensure_ascii=False) # 关闭asscii logging.debug(r'{}-->{}'.format(data, fp)) json_write(data=json_read()) # null json 文件处理 # 异常处理即可,读取空json意义不大。 from json.decoder import JSONencodeError
yaml操作
yaml支持str,number,bool,null。以及由这四种类型组成的键值对,数组(key对应的value数组有几个成员,key的下面就有一个"-")。
yaml的key始终是str。key与value用冒号加空格区分。
yaml的特殊value:1,1.2,true,false,null。safe_load会处理成number,bool,None。其它的则处理成str。(使用safe_load,不要用load)
yaml的特殊value做字符串处理:使用引号消除特殊value的特殊性,标记为str,会以str转化为dict的value。如:"true"->"true","1.3"->"1.3"
yaml的两种编写方式:yaml风格:key: - value...,dict/json风格:{"key":[ "value", true, null, 100, "null"]}
#! coding=utf-8 import yaml # 读取yaml->dict def yaml_read(fp=YAML_FILE): with open(fp, mode='r', encoding='utf-8') as f: data = yaml.safe_load(f) logging.debug(r'{}-->{}'.format(fp, data)) return data # 写入dict->yaml def yaml_write(data, fp=YAML_FILE): with open(fp, mode='w', encoding='utf-8') as f: yaml.dump(data, f) logging.debug(r'{}-->{}'.format(data, fp)) yaml_write(yaml_read())
3.csv,excel文件
csv
字段之间默认以英文逗号分隔,csv->iter(),iter对象,需要是用for或next才可获取具体的数据
csv读取的两种形式:
①reader方法,从第一行开始迭代,为list。-> [v1,v2,v3]
②Dictreader方法,第一行为key行,从第二行开始迭代,为list。->[(k1,v11),(k2,v12).(k3,v13)]
csv写入数据两个步骤:
①csv_writer = csv.writer(f)
②csv_writer.writerow([v1,v2,v2]) ->写入一行
xls/xlsx
工具:xlrd/xlwt/xlutils/openpyxl。xlrd读,xlwt写,xlutils.copy复制,openpyxl
#! coding=utf-8 import xlrd,xlwt,xlutils # 读 def read_xls(fp=XLS_FILE): # 获取wb wb = xlrd.open_wordbook(fp) # 获取sheet cur_sheet = wb.sheet_by_name("sheet_name") # 获取value: row_values(row_no) column_values(column_no) cell_value(row_no,column_no) # 获取number cur_sheet.nrows cur_sheet.ncols # 写 def write_xls(fp=XLS_FILE): # 获取wb wb = xlrd.open_wordbood(fp) # copy wordbook c_wb = copy(wb) # 获取sheet cur_sheet = c_wb.get_sheet(0) # 写一行 cur_sheet.row(1,1,'value') # 更新单元格 cur_sheet.write(1,1,'value')
4.ini
ini配置文件解析需要使用configparse模块
ini组成:sections,items,options。所有的sections和options都做字符串处理。value支持:数值,布尔,字符串。
#! coding=utf-8 import configparser # 读 def read_ini(section_name=None, option_name=None, fp=INI_FILE): # with open(fp, 'r', encoding='utf-8') as f: config = configparser.ConfigParser() config.read(fp, encoding='utf-8') # items if section_name and not option_name: return config.items(section_name) # options if section_name and option_name: return config.get(section_name, option_name)