python-文件读取

文本文件处理

  常见的文本文件有:①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) + '\n' 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)

 

posted @ 2020-09-13 01:51  花兒向陽開  阅读(157)  评论(0编辑  收藏  举报