![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=1739284670-hvHgeHi7hCUY2S4wGXPqgZKgrSiSywfI-0-febd652c5e66223166876393e04d5c0a)
图2-2 样例文件路径位置
通过导入os系统模块,把Python切换到这个文件路径下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/29_03.jpg?sign=1739284670-hjJCkF9pQRA4Nh5zHhubdRXMsYCqV0C4-0-d48b58e4ba5e1d4aaf5e188995e9e558)
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=1739284670-Trw9udXT8e21nirWbVNTPuqmDsSq36q8-0-bd228e40ed21d855599cfc5a6b0b53d1)
运行结果如下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_02.jpg?sign=1739284670-OCBlYFFGFVKrFnVEwiTsiGCpLAO8VWL8-0-0b8479e44a09ea3fb6e132cf057e7b9e)
上面只赋予Excel名称的读取方式,默认打开的是第一个工作表(sheet)。当一个Excel文件包含多个工作表时,通过指定具体sheet_name的方式实现更精准的读取:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_03.jpg?sign=1739284670-mw3nOjpBcbcsN9kCSJXl9WkvP2v2merJ-0-bb34bbf837c81c56f6d5b311e985aa83)
读取结果如下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_04.jpg?sign=1739284670-5Lqs2VEhcvoTTxYcDDQYGUIhYGFGThpS-0-daa2ebfad7576bfcdc17db897d57e4cf)
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=1739284670-ujTiAfy9JnYggnkOfTPcs6jrxMFyJuik-0-9ce75be6248f089d32ecf229e63da1c7)
Pandas在读取的时候很智能地把第一行当作了表头来处理,数据则从第二行开始。
假如我们遇到了sheet2中的数据,当时在Excel文件中只保存了数据,而没有保存表头,如表2-4所示。
表2-4 data1.xlsx中sheet2的数据源
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/30_06.jpg?sign=1739284670-o8j8SQwTU7HfZEcmDx0TfTDJflr1IYZJ-0-4e17d44c8414ad120328e0747c25c2f2)
如果用Pandas直接读取,默认将第一行当作表头的规则就显得不那么智能了,读取和展示结果如图2-3所示。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/31_01.jpg?sign=1739284670-S81mNJgQkbTZ3cDQupkkk5mLu8JADTeD-0-6e1fe64e879f2bafd4433c648cd891fb)
图2-3 读取没有表头的数据
这个时候可以把header参数设置成None,来告诉Pandas源数据中没有表头,效果如图2-4所示。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/31_02.jpg?sign=1739284670-aI0rWiZIi6HkGbfY9x5xPodLvsIMmeck-0-9ee90d21324dbcb01ca6494f2f14f518)
图2-4 设置header读取无表头数据
如果将header设置成None,默认的表头是从0~3的几个数字,很不美观。我们可以在读取的时候通过names参数,把表头设置成我们期望的内容,如图2-5所示。
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/31_03.jpg?sign=1739284670-cIYmWsY9D25zIn8gLBAJ4UcAdVJRKU34-0-bf82c77138b40365f6e035e1d758a316)
图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=1739284670-LLpwm7gfofWDUnQ1WmX8ppVKrkHAlReZ-0-5c5b21d7f117580ee142e946f80b2a5c)
图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=1739284670-TPj9eLvX7cwPHQzvWz8Uj4earIKjG7WA-0-fde3dbf8610a0e564d79342996bd4153)
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=1739284670-OMe8gZ5kthrsVb6XHDxmKsrK2RV55L1P-0-141b27236fe7ccdc04942b701bce0efa)
图2-7 读取数据报错
通过设置encoding参数来指定文件编码格式,在读取gbk和其他编码文件的时候设置成对应编码即可解决问题:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/33_02.jpg?sign=1739284670-r53khpHHuB1fVhuthsY6HPmqg18Sv546-0-c869f08429ecafa1900c79fbe3fdc8e6)
结果如下:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/33_03.jpg?sign=1739284670-aNo7DOLPqT98n8I29y2Vj8AL0ZZEbVmR-0-df4e419e37162d5ed069d3d9735ab3bc)
3.分隔符的处理
pd.read_csv()方法在读取CSV文件时,默认是以逗号作为分隔符来打开的(这也是绝大部分CSV文件使用的分隔方式),但如果文件在存储时使用的是其他分隔符,那么就需要在读取时设置好sep参数:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/33_04.jpg?sign=1739284670-rO5Kkwn1fadbZ31tAv2vrjiThu5QkW4j-0-e0cdf48c9f30d93b39b37d664ecd15d0)
以上代码打开的文件是以\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=1739284670-QIeUn4qqQd3ll5URYiJ4fwOF1IinbFj5-0-c14e8d90f64669db45ab6033935118a5)
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=1739284670-K2aGXuMrP4afHSextLHWdCiSDHWMK5VF-0-81c54edea31d781f1ed4ef0cdea160c4)
默认的存储方式会把索引也作为一列存储,如果不希望存储索引,设置index=False即可:
![](https://epubservercos.yuewen.com/153811/28613833202733106/epubprivate/OEBPS/Images/34_02.jpg?sign=1739284670-rBjQgakVKkXowQlbHntz1r6mliHuVM06-0-3d67bfc776070daba889cbd1c32a9e86)