Python之文件读写操作【CSV/Excel/JSON/XML/TXT】

⛄前言

CSVComma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。CSV文件通常以 .csv 作为文件扩展名。

XLS就是Microsoft Excel工作表,是一种非常常用的电子表格格式。xls文件可以使用Microsoft Excel打开,另外微软为那些没有安装Excel的用户开发了专门的查看器Excel Viewer。使用Microsoft Excel可以将XLS格式的表格转换为多种格式:XML表格、XML数据、网页、使用制表符分割的文本文件(.txt)、使用逗号分隔的文本文件(.csv)等。

XLSXMicrosoft Office EXCEL 2007/.../2019文档及以上的扩展名。其基于Office Open XML标准的压缩文件格式取代以前专有的默认文件格式,在传统文件名扩展名后面添加字母"x"(即.docx取代.doc.xlsx取代.xls.pptx取代.ppt)。任何能够打开.xlsx文件的文字处理软件都可以将该文档转换为.xls文件,.xlsx文件比.xls文件所占用空间更小。

xlsx格式文档文件无法被EXCEL2003及以下版本EXCEL软件直接打开编辑,安装OFFICE2007兼容包后可以打开查看。手动将XLSX文件后缀修改为XLS无法改变文档文件的本质属性,是不能被EXCEL2003等低版本EXCEL直接打开编辑的。用户可在EXCEL软件成功打开EXCEL2007专有XLSX格式文档的前提下,采用另存为方式将其转换为EXCEL97—2003格式文档的XLS文件这样可与旧的版本兼容,但一些EXCEL2007文档专有的特性格式可能丢失。Excel xlsxlsx的详细区别如下:

  • 文件格式不同xls是一个特有的二进制格式,其核心结构是复合文档类型的结构,而xlsx的核心结构是XML类型的结构,采用的是基于XML的压缩方式,使其占用的空间更小。xlsx中最后一个x的意义就在于此。
  • 版本不同xlsexcel2003及以前版本生成的文件格式,不管有没有宏程序的话都是xls文件,而xlsxexcel2007及以后版本生成的文件格式,从2007开始做了区分,XLSM文件和XLSX文件都是excel2007及其以后的文件,但前者是含有宏启用,Excel中默认情况下不自动启用宏,默认是XLSXVBA中,如果不想保存代码,可以保存为xlsx,即可自动删除其中VBA代码,反之则保存为XLSM文件。
  • 兼容性不同xlsx格式是向下兼容的,可兼容xls格式。07版的Office Excel,能打开编辑07版(后缀.xlsx)的Excel文件,也能打开编辑03版(后缀.xls)的Excel文件,都不会出现乱码或者卡死的情况。03版的Office Excel,就只能打开编辑03版(后缀.xls)的Excel文件;如果打开编辑07版(后缀.xlsx)的Excel文件,则可能出现乱码或者开始能操作到最后就卡死,以后一打开就卡死。
  • 默认保存方式上xls是03版Microsoft Office Excel 工作表的格式,用03版Office,新建Excel默认保存的Excel文件格式的后缀是.xlsxlsx是07版Microsoft Office Excel 工作表的格式,用07版Office,新建Excel默认保存的的Excel文件格式后缀是.xlsx
  • 容量不同xls只有65536行、256列;xlsx可以有1048576行、16384列

JSONJavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

XML (Extensible Markup Language, 可扩展标记语言) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言可扩展性良好,内容与形式分离,遵循严格的语法要求,保值性良好等优点。

TXT文件是微软在操作系统上附带的一种文本格式,是最常见的一种文件格式,早在DOS时代应用就很多,主要存储文本信息,即为文字信息,现在的操作系统大多使用记事本等程序保存,大多数软件可以查看,如记事本,浏览器等等。

⛄Python之读写文件

👀CSV

(1)CSV库读取

csv.reader:以列表的形式返回读取的数据;
csv.writer:以列表的形式写入数据;
csv.DictReader:以字典的形式返回读取的数据;
csv.DictWriter:以字典的形式写入数据。

import csv
with open(r"D:\Desktop\data.csv") as file:
    reader = csv.reader(file)
    print(reader)
    print("*"*20)
    # 用next()函数读取文件时:如果只执行一次默认读取第一行。
    headers = next(reader)
    print(headers)
    print("*"*20)
    for row in reader:
        print(row)
        print(row[2])

# 输出结果
<_csv.reader object at 0x000001D6B95F1668>
********************
['name', 'gender', 'age', 'hobby']
********************
['小红', '女', '20', '跑步']
20
['小汤', '男', '22', '篮球']
22
['小李', '男', '24', '足球']
24

namedtuple(具名元组),因为元组的局限性:不能为元组内部的数据进行命名,所以往往我们并不知道一个元组所要表达的意义,在这里引入了collections.namedtuple 这个工厂函数,来构造一个带字段名的元组。具名元组的实例和普通元组消耗的内存一样多,因为字段名都被存在对应的类里面。

# 获取一行数据中的某一列数据
import csv
from collections import namedtuple
with open(r"D:\Desktop\data.csv") as file:
    reader = csv.reader(file)
    print(reader)
    print("*"*20)
    headers = next(reader)
    # namedtuple(具名元组)返回一个具名元组子类 typename
    Row = namedtuple('Row', headers)
    print(headers)
    print("*"*20)
    for row in reader:
        # 列表或元组前面加星号作用是将列表解开成两个独立的参数;
        # 字典前面加两个星号,是将字典的值解开成独立的元素作为形参。
        row = Row(*row)
        # 获取一行数据中的某一列数据。
        print(row.name,row.age)

# 输出结果
<_csv.reader object at 0x000001D6B95F1128>
********************
['name', 'gender', 'age', 'hobby']
********************
小红 20
小汤 22
小李 24

简单使用csv.DictReader

可以深入了解该函数的参数:

  • csv.DictReader()fieldnames参数
  • csv.DictReader()restkey参数
  • csv.DictReader()restval参数
import csv
with open(r"D:\Desktop\data.csv") as file:
    '''
    # 如果没有字段名,参数fieldnames
    reader = csv.DictReader(file,fieldnames = ['name','gender','age','hobby'])
    # next()方法用于移动指针
    head_row = next(reader)
    '''
    reader = csv.DictReader(file)
    print(reader)
    print("*"*20)
    for row in reader:
        # OrderedDict是一种长相类似于列表的数据类型,该列表中嵌套着元组;
        # 每个元组中的第一个元素为键,第二个元素为值(类似于字典)
        print(row)
        print(row["name"],row["hobby"])

# 输出结果
<csv.DictReader object at 0x000001D6B95F0388>
********************
OrderedDict([('name', '小红'), ('gender', '女'), ('age', '20'), ('hobby', '跑步')])
小红 跑步
OrderedDict([('name', '小汤'), ('gender', '男'), ('age', '22'), ('hobby', '篮球')])
小汤 篮球
OrderedDict([('name', '小李'), ('gender', '男'), ('age', '24'), ('hobby', '足球')])
小李 足球
(2)CSV库写入

csv.reader:以列表的形式返回读取的数据;
csv.writer:以列表的形式写入数据;
csv.DictReader:以字典的形式返回读取的数据;
csv.DictWriter:以字典的形式写入数据。

import csv
# 1. 创建文件对象(指定文件名,模式,编码方式),指定下次写入在这次的下一行
# 注意引入newline="",不然加入的数据会空一行
with open(r"D:\Desktop\data.csv", "a+", encoding="gbk", newline="") as f:
    # 2. 基于文件对象构建 csv写入对象
    csv_writer = csv.writer(f)
    # 3. 构建列表头
    # name = ['name','gender','age','hobby']
    # csv_writer.writerow(name)
    # 4. 写入csv文件内容
    z = [["小ai", "男", 21, "篮球"],["小张", "男", 25, "篮球"]]
    csv_writer.writerows(z)
with open(r"D:\Desktop\data.csv", "r+", encoding="gbk", newline="") as f:   
    reader = csv.reader(f)
    headers = next(reader)
    for row in reader:
        print(row)

# 输出结果
['小红', '女', '20', '跑步']
['小汤', '男', '22', '篮球']
['小李', '男', '24', '足球']
['小ai', '男', '21', '篮球']
['小张', '男', '25', '篮球']

如果csvfile是文件对象,则打开它时应使用newline=""。如果没有指定newline="",则嵌入引号中的换行符将无法正确解析,并且在写入时,使用\r\n换行的平台会有多余的\r写入。由于csv模块会执行自己的(通用)换行符处理,因此指定newline=""应该总是安全的。

open()完成后必须调用close()方法关闭文件,因为文件对象会占用操作系统资源,并且操作系统同一时间能打开的文件数量也是有限的。由于文件读写时有可能产生IOError,一旦出错,后面的f.close()就不会调用。with open()则可以避免这样的情况。

模式 描述
t 文本格式打开文件(默认)。一般用于文本文件,如:txt
b 二进制格式打开文件。一般用于非文本文件,如:图片。
r 只读方式打开文件(默认模式)。文件的指针将会放在文件的开头,如果文件不存在会报错
w 只写方式打开文件。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,则创建新文件。
a 追加方式打开文件,同样是只写,不允许进行读操作。如果文件已存在,文件指针将会放在文件的结尾,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+ 打开一个文件用于读写。如果文件存在,则打开文件,将文件指针定位在文件头,新写入的内容在原有内容的前面;如果文件不存在会报错。
w+ 打开一个文件用于读写。如果文件存在,则打开文件,清空原有内容,进入编辑模式;如果文件不存在,则创建一个新文件进行读写操作。
a+ 以追加模式打开一个文件用于读写。如果文件存在,则打开文件,将文件指针定位在文件尾,新写入的内容在原有内容的后面;如果文件不存在,则创建一个新文件用于读写。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

csv库常见的问题

  • csv.DictWriter():该函数返回的结果遍历一次之后,再次遍历返回的结果是空列表。
  • csv.reader():返回的结果是结构体,需要for循环才能调用,不能像list那样直接选取特定单元格。
  • 通过列名来查找指定列的操作麻烦。
(3)pandas库读取

使用pandas读取csv文件的优势:

  • 方便,有专门支持读取csv文件的pd.read_csv()函数;
  • csv转换成二维列表形式;
  • 支持通过列名查找特定列;
  • 相比csv库,事半功倍。
pandas.read_csv(filepath_or_buffer, sep=, delimiter=None, header=‘infer’, names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression=‘infer’, thousands=None, decimal=., lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None, storage_options=None)

# 常用参数详解1)filepath_or_buffer:必须有的参数,其它都是按需求选用的。文件所在处的路径。
(2)sep:指定分隔符,默认为逗号','。
(3)delimiter:str/default/None,定界符,备选分隔符(如果指定该参数,则sep参数失效)
(4)header:int or list of ints
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值