![Python电商数据分析实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/541/48899541/b_48899541.jpg)
2.2 数据读取和存储
2.2.1 Excel文件的读取
1.文件路径的切换
要读取某一个文件中的数据,必须先告诉Python这个文件所在的位置,即输入文件路径。
现有一个名为data1的Excel文件,存放在如图2-2所示的位置。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/29_02.jpg?sign=1739195162-gZKV4C0o03npUVqyib7BIsOwJZgaVldF-0-4d16b27e93325a5516d08a0983c8fa8e)
图2-2 样例文件路径位置
通过导入os系统模块,把Python切换到这个文件路径下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/29_03.jpg?sign=1739195162-WRfPKxcYacLlU79wOvgctV54lbXb1vRM-0-d3a6b58161a6cb394b14b607a6ec773d)
os.chdir()是实现系统文件路径切换的方法,可在其括号中输入我们从系统中复制的文件地址。
需要注意的是,路径前面加了一个r。文件路径一般都包含斜杠,而斜杠在Python中会有其他含义(如转义),在路径前加r相当于告诉Python路径里的内容没有其他意思,从而保证路径被程序完整、准确地理解。
2.read_excel()的用法
切换完路径之后,用Pandas的pd.read_excel('具体文件名')(这里为data1.xlsx)来读取Excel文件:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_01.jpg?sign=1739195162-YItehhBjuAneuXCsTd5EUlnwAiSGxXk0-0-01bed4e4f1be55f11e56e91fde4f70e8)
运行结果如下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_02.jpg?sign=1739195162-ojMUJvN1CVjblDbYduu3mP2Ev9qpwXJr-0-8b718e6229f5a1289ff5ec50aaf371ea)
上面只赋予Excel名称的读取方式,默认打开的是第一个工作表(sheet)。当一个Excel文件包含多个工作表时,通过指定具体sheet_name的方式实现更精准的读取:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_03.jpg?sign=1739195162-Pkse0OMcZFMz1d3oOlUof7PfSvtJpoDc-0-0de823bdfd31c74aaa6c13fdd600b209)
读取结果如下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_04.jpg?sign=1739195162-WWiiuBYON1KxVa8dctEbDu78q6EG9mVH-0-897791bc97508a847dbf3fe174678cf5)
3.header和names
data1.xlsx中sheet1的数据源如表2-3所示。
表2-3 data1.xlsx中sheet1的数据源
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_05.jpg?sign=1739195162-qAtSNReco92PiqDkWDpOLSQr6iENkF6M-0-4673e2872db18aeb2654124c5154ae65)
Pandas在读取的时候很智能地把第一行当作了表头来处理,数据则从第二行开始。
假如我们遇到了sheet2中的数据,当时在Excel文件中只保存了数据,而没有保存表头,如表2-4所示。
表2-4 data1.xlsx中sheet2的数据源
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_06.jpg?sign=1739195162-iTIDkjomuSnyaymU5ykn34nl8oMuVlqt-0-6b87e6366dfb06777aa9390f55046151)
如果用Pandas直接读取,默认将第一行当作表头的规则就显得不那么智能了,读取和展示结果如图2-3所示。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/31_01.jpg?sign=1739195162-meYNzZzEvDdXE9Xk8z64V0KqAhGh6zed-0-29037f88224f303c8832329d86c7deaa)
图2-3 读取没有表头的数据
这个时候可以把header参数设置成None,来告诉Pandas源数据中没有表头,效果如图2-4所示。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/31_02.jpg?sign=1739195162-419neTCMnUgy2YGXB3KASA68TzScjpIE-0-449649b2155fc8b10c9849adea32e9e9)
图2-4 设置header读取无表头数据
如果将header设置成None,默认的表头是从0~3的几个数字,很不美观。我们可以在读取的时候通过names参数,把表头设置成我们期望的内容,如图2-5所示。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/31_03.jpg?sign=1739195162-W6N8Zrkflu5y8ouFRMDdQsujzobACzQP-0-4b2f55e29e219d5fd4156eb0e42c260e)
图2-5 读取时设置表头
当然,header除了设置成None,还可以设置成数字,代表在读取时把第几行数据作为表头。假如我们想要把Sheet1中的小明所在的第二行作为表头,只需把header设置成1(Python中计数从0开始)即可,如图2-6所示。
这样一来,小明对应的数据行就成了表头。
4.其他参数
除了默认或指定Sheet读取、设置数据表头,Pandas读取数据还有很多灵活操作的参数,例如:
❑index_col指定索引列;
❑usecols指定读取部分列;
❑nrows指定读取部分行;
❑prefix给表头设置前缀;
❑dtype和字典结合,读取时为每一列数据设置格式。
参数非常丰富,不过我们的Pandas学习之旅有一个重要原则是“抓大放小”,为了避免陷入细节的泥沼无法自拔,比较琐碎且不常用的参数不展开介绍,只是告诉大家有相关的参数,读者在需要的时候可以自行查阅。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/32_01.jpg?sign=1739195162-5GZd6AvKwVxTaQG4xtsBuFLp0jOxg8Ub-0-d77f1e7dcaf968f2ca008f30fe0376b1)
图2-6 用header指定表头
2.2.2 CSV文件的读取
Pandas读取CSV文件用的是pd.read_csv('具体文件名')方法。不过Pandas在Excel和CSV文件的读取上有很高的相似性,上一小节讲的大多数规则和参数也适用于CSV文件的读取。
需要注意的是,在实际操作中Excel文件的读取一般不会有什么问题,但由于中文路径和编码等问题,CSV的读取是报错的高发区。接下来,重点看看CSV文件的3个注意点以及如何避免错误。
1.中文路径
当文件路径是中文时,如果直接读取,在一些Python版本里会报错。因为Python默认的读取引擎是C语言,它在处理中文时容易出问题。这个时候把读取引擎参数engine设置为Python就可以解决:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/32_02.jpg?sign=1739195162-COWSTY41OE4l76MNkqdABVRLHhkzukuH-0-0b53cf171e2b2878560ffa71080208a5)
2.编码设置
CSV文件有不同的编码形式,utf-8和gbk是两种最常见的编码形式。类似于一把钥匙对一个锁,如果文件是gbk编码,那么用utf-8就打不开。Pandas在读取文件时默认采用utf-8的编码格式。
用默认的方式打开我们CSV的案例数据,可能会报错,如图2-7所示。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/33_01.jpg?sign=1739195162-NOKRhqqtDa2rABSA4Kn1YQXvgIauJoER-0-89b498233e56945e80062222eb0591e9)
图2-7 读取数据报错
通过设置encoding参数来指定文件编码格式,在读取gbk和其他编码文件的时候设置成对应编码即可解决问题:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/33_02.jpg?sign=1739195162-5agf4nERRjBbODlFYAHdkthwf4QmcLaN-0-3d92e17edfa3a75fb3e3cba0f01868b5)
结果如下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/33_03.jpg?sign=1739195162-a7BWn95V9yFblU1ZFfJg1jU8keiQl5NZ-0-a5f638cc36726ff3ce37bbf8bb27ab4d)
3.分隔符的处理
pd.read_csv()方法在读取CSV文件时,默认是以逗号作为分隔符来打开的(这也是绝大部分CSV文件使用的分隔方式),但如果文件在存储时使用的是其他分隔符,那么就需要在读取时设置好sep参数:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/33_04.jpg?sign=1739195162-O7WhCg5XolQbKORZo2ANXgBRETZP5AlQ-0-11b163c88650c0d1080ee1c9c99ea460)
以上代码打开的文件是以\t为分隔符的。
2.2.3 其他文件类型的读取
1.TXT文件的读取
Pandas读取TXT文件用的是pd.read_table()方法,需要在读取时输入TXT文件的名称和分隔符(这里必须指定):
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/33_05.jpg?sign=1739195162-tkZwn10tc0YJgkqugmalG8mvCQ69qKQR-0-1509f756d799f3c8dec57e72c8f8d501)
2.JSON文件的读取
JSON文件是一种类字典形式的文件,在读取时用pd.read_json()方法。
Excel和CSV是两种最为常见的文件类型,其他文件类型的读取这里只简单提及,因为它们只有打开的方法有所差异,大部分参数对它们也是通用的。
2.2.4 存储数据
当对数据进行读取、处理和分析之后,往往需要把结果数据存储起来。
在Pandas中存储数据非常方便,用的是data.to_×××()方法(×××是你期望存储的文件类型):
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/34_01.jpg?sign=1739195162-u8UmAVA8z92sul6SYHarr8JrjyimIo9G-0-30c218a7d14cccf335978448882fc2ab)
默认的存储方式会把索引也作为一列存储,如果不希望存储索引,设置index=False即可:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/34_02.jpg?sign=1739195162-deJ0G1vHVRnR58ydE3ZIbRzFmcAiVUSz-0-8b9df5e675ed1684178ba4ce6a096a52)