⛄前言
CSV
(Comma-Separated Values
,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV
文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。CSV
文件通常以 .csv
作为文件扩展名。
XLS
就是Microsoft Excel
工作表,是一种非常常用的电子表格格式。xls
文件可以使用Microsoft Excel
打开,另外微软为那些没有安装Excel
的用户开发了专门的查看器Excel Viewer
。使用Microsoft Excel
可以将XLS
格式的表格转换为多种格式:XML
表格、XML
数据、网页、使用制表符分割的文本文件(.txt
)、使用逗号分隔的文本文件(.csv
)等。
XLSX
是Microsoft 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 xls
和xlsx
的详细区别如下:
- 文件格式不同:
xls
是一个特有的二进制格式,其核心结构是复合文档类型的结构,而xlsx
的核心结构是XML
类型的结构,采用的是基于XML
的压缩方式,使其占用的空间更小。xlsx
中最后一个x
的意义就在于此。- 版本不同:
xls
是excel2003
及以前版本生成的文件格式,不管有没有宏程序的话都是xls
文件,而xlsx
是excel2007
及以后版本生成的文件格式,从2007
开始做了区分,XLSM
文件和XLSX
文件都是excel2007
及其以后的文件,但前者是含有宏启用,Excel
中默认情况下不自动启用宏,默认是XLSX
。VBA
中,如果不想保存代码,可以保存为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
文件格式的后缀是.xls
;xlsx
是07版Microsoft Office Excel
工作表的格式,用07版Office,新建Excel
默认保存的的Excel
文件格式后缀是.xlsx
。- 容量不同:
xls
只有65536行、256列;xlsx
可以有1048576行、16384列
JSON
(JavaScript 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