![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=1739323611-ITTe0lDI9dJYeUBqvoit8C6cIVZXnjg5-0-dbc141972d62a80e4fffde357435f7b6)
图2-2 样例文件路径位置
通过导入os系统模块,把Python切换到这个文件路径下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/29_03.jpg?sign=1739323611-LDvPsiD9suYQvxuNcoXpwUyLX0Ap6gGJ-0-6ff164534fcf132f8f62bc959567663b)
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=1739323611-waEhbwIsoQh7xmOmGWfA6xzqdGt4ypvR-0-0d05cbbf7faf9fee197d2755e08361c4)
运行结果如下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_02.jpg?sign=1739323611-8xCnx3EL3TP3VkEBX4OvY7VHPk6W6Ilw-0-41304a2bfae7cbd48dce8c8876ba2226)
上面只赋予Excel名称的读取方式,默认打开的是第一个工作表(sheet)。当一个Excel文件包含多个工作表时,通过指定具体sheet_name的方式实现更精准的读取:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_03.jpg?sign=1739323611-co7CIpgAYGryOEkdlRAJsNJfWsKruJX4-0-7290ec95f69dba81f3f090d1202d91ee)
读取结果如下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_04.jpg?sign=1739323611-4dCG7cmwV3pKTBhx6W0mvrmzCeaCdgUJ-0-4abb0e5188303b5ce10e99f17f4c4865)
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=1739323611-WXxrO8jQUdyl9ZmpFbsls1ZG2tE2SJxz-0-8e0484d0341f05fb7896eb52d46c3b89)
Pandas在读取的时候很智能地把第一行当作了表头来处理,数据则从第二行开始。
假如我们遇到了sheet2中的数据,当时在Excel文件中只保存了数据,而没有保存表头,如表2-4所示。
表2-4 data1.xlsx中sheet2的数据源
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_06.jpg?sign=1739323611-YEq605d3wWWUqvwzNHtPsyn881FlbOff-0-5c3c429ac313dac39988e6754390f2b9)
如果用Pandas直接读取,默认将第一行当作表头的规则就显得不那么智能了,读取和展示结果如图2-3所示。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/31_01.jpg?sign=1739323611-uYI96PitdrTD6qbsW7uk6PGLjQWQpiQf-0-70a21095bde38d7b59aacc31ca5ce7eb)
图2-3 读取没有表头的数据
这个时候可以把header参数设置成None,来告诉Pandas源数据中没有表头,效果如图2-4所示。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/31_02.jpg?sign=1739323611-7wlLBczGEk5nILPnT8Qsn3OEe8QuyxZg-0-936f6bd2269ce4d8f1baad03f83fdfc4)
图2-4 设置header读取无表头数据
如果将header设置成None,默认的表头是从0~3的几个数字,很不美观。我们可以在读取的时候通过names参数,把表头设置成我们期望的内容,如图2-5所示。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/31_03.jpg?sign=1739323611-oJUHD3xkzSxLu89rivw1X2HnBCDByCMH-0-00a17bad36aebec9bfeec3445df6d806)
图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=1739323611-7QfO0PGmhYC0iZZF59I1CN4vuJSAurpo-0-970a4aeeb188a6188b8298317612c989)
图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=1739323611-UBTIj3N5Yq0hy7xEomuptuQnueJlXJPe-0-2b6bd6e15ccdf9011faa79dc366e2d2e)
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=1739323611-i7rjhx0EWroLop3liemuWElebb24sv0e-0-12d72314cd339a6f272faaa085e0f418)
图2-7 读取数据报错
通过设置encoding参数来指定文件编码格式,在读取gbk和其他编码文件的时候设置成对应编码即可解决问题:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/33_02.jpg?sign=1739323611-IjESxcQcEAMVnpHfKqtzDl3mb8fjTdmC-0-0e833c43011f9671114efc579a75af16)
结果如下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/33_03.jpg?sign=1739323611-lb2xWlaAm5EdUAD8eCXOZh2TpxDG6pp4-0-d7d2b60173d266dcab205f017df74d01)
3.分隔符的处理
pd.read_csv()方法在读取CSV文件时,默认是以逗号作为分隔符来打开的(这也是绝大部分CSV文件使用的分隔方式),但如果文件在存储时使用的是其他分隔符,那么就需要在读取时设置好sep参数:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/33_04.jpg?sign=1739323611-EwWDDw74PiJ3CH539B3RozbJPv0vdChr-0-596338633e3d079973983b1371db7dba)
以上代码打开的文件是以\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=1739323611-6DQGGJwWGiCcQU9XUK4pdlHE1ZhfjEoa-0-18f55ac2fdafd0ca3645739f3b357ab1)
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=1739323611-rokJzQfJWtvcrXN4eYD8s1PeLD9YgRUo-0-7bfd7278b4d309b3084b665e9ca6515c)
默认的存储方式会把索引也作为一列存储,如果不希望存储索引,设置index=False即可:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/34_02.jpg?sign=1739323611-zGrgwci28nTvRbDsXN5oMqaGxt43Te7G-0-cd361d419f9294cf41bfb5be146412f9)