上篇,对python操作excel做了简单介绍,好评如潮。见python小白社群之Python遇到excel-1

python也能做excel大神之一:熊猫(pandas)的大用处

本文进一步讲解,了解如何在Python中读取和导入Excel文件,如何将数据写入这些电子表格以及哪些是执行此操作的最佳软件包。以下操作适合python专业人士或半专业人士进行实操,也适合非python人士阅读吹牛用。:-)



python自动操作exe python自动操作excel_数据


使用Python和Excel进行数据科学

Excel是Microsoft开发的电子表格应用程序。可以使用python来组织,分析和存储表中的数据。。

今天的教程将为提供有关如何使用Excel和Python的进一步讲解。它将为提供可用于在Python的帮助下将这些电子表格加载和写入文件的包的概述。将学习如何使用软件包,如pandas,openpyxl,xlrd,xlutils和pyexcel。

(本文采用实例结合交互式课程讲解:在Python中导入数据,在Python中使用CSV和Excel文件。)


python自动操作exe python自动操作excel_数据_02


数据作为的起点

当启动数据项目时,通常会使用从网络抓取中收集的数据,但也可以从其他地方下载的数据集,例如,Quandl等。

但通常情况下,还可以在Google或其他用户共享的存储库中找到数据。这些数据可能在Excel文件中,也可能保存到带.csv扩展名的文件中.....可能会出现无穷无尽的可能性。但是,只要有数据,第一步应该是确保数据质量。


python自动操作exe python自动操作excel_python自动操作exe_03


检查excel结构化数据的质量

要查看excel数据质量,可以查看以下清单:

· excel数据是否代表静态数据?

· excel数据是否会混合数据,计算和报告?

· excel数据是否完整且一致?

· excel数据是否具有系统的工作表结构?

· 是否检查了excel中的实时公式是否有效?

这个问题列表是为了确保的excel不会违反行业中普遍接受的最佳做法。当然,上面的列表并不详尽:可以遵循更多通用规则,以确保的excel真实有效。上面提出的问题与确定excel是否定性时最为相关。

excel数据的最佳实践


python自动操作exe python自动操作excel_python_04

excel数据的最佳实践


在使用Python读取excel之前,还需要考虑调整文件以满足一些基本原则,例如:

· excel的第一行通常保留用于标题,而第一列用于标识采样单位;

· 避免使用带空格的名称,值或字段。否则,每个单词将被解释为单独的变量,从而导致与数据集中每行元素数量相关的错误。考虑使用:

· 强调,

· 破折号,

· 驼峰规则,每个文本部分的第一个字母大写,或

· 连接词

· 短名称比较长名称更受欢迎;

· 尽量避免使用含有符号如姓名?,$,%,^,&,*,(,),-,#,?,,,,/,|,,[,],{,和};

· 删除在文件中所做的任何注释,以避免将额外的列或NA添加到的文件中; 和

· 确保数据集中的任何缺失值都以NA表示。

接下来,在进行必要的更改或彻底查看数据后,请确保在保存更改后保存更改。通过执行此操作,可以稍后重新访问数据以进行编辑,添加更多数据或更改数据,同时保留可能用于计算数据的公式等。

如果正在使用Microsoft Excel工作,会看到有保存文件相当多的选择:除了默认的扩展.xls或者.xlsx,可以去"文件"选项卡,点击"另存为",然后选择其中一个扩展名列为"另存为类型"选项。保存数据科学数据集的最常用扩展是.csv和.txt(作为制表符分隔的文本文件)。根据选择的保存选项,数据集的字段由制表符或逗号分隔,这些将构成数据集的"字段分隔符"。

现在已经检查并保存了的数据,可以从准备工作区开始!


python自动操作exe python自动操作excel_python操作excel_05


准备环境


python自动操作exe python自动操作excel_python操作excel_06


万事开头难,准备环境是可以做的第一件事,以确保顺利开始。第一步是检查的工作目录。

当在终端中工作时,可能首先导航到的文件所在的目录,然后启动Python。这也意味着必须确保的文件位于想要使用的目录中!

但也许更重要的是,如果已经启动了Python会话并且不了解正在使用的目录,则应考虑执行以下命令:

# Import `os` import os # Retrieve current working directory (`cwd`) cwd = os.getcwd() cwd # Change directory os.chdir("/path/to/your/folder") # List all files and directories in current directory os.listdir('.')

这些命令不仅对于加载数据而且对于进一步分析都非常重要。

现在,继续:已完成所有检查,已保存数据并准备工作区。

能从Python中读取数据吗?

安装包以读取和写入Excel文件

不要着急,还需要做最后一件事。

即使还不知道导入数据所需的软件包,但必须确保在时机成熟时准备好安装这些软件包。

安装命令准备: pip

这就是需要安装pip和setuptools安装的原因。如果安装了Python 2> = 2.7.9或Python 3> = 3.4,则无需担心,因为通常已经准备好了。在这种情况下,请确保已升级到最新版本。

为此,请在终端中运行以下命令:

# For Linux/OS X pip install -U pip setuptools # For Windows python -m pip install -U pip setuptools

如果pip尚未安装,请运行快捷安装命令,python get-pip.py安装pip(get-pip.py请直接google搜索下载)。此外,如果需要更多帮助以正确安装所有内容,则可以按照页面上的安装说明进行操作。

安装Anaconda


python自动操作exe python自动操作excel_python自动操作exe_07


如果使用Python进行数据科学,可以考虑的另一个选择是安装Anaconda Python发行版。通过这样做,可以轻松快捷地开始进行数据科学,因为无需担心单独安装数据科学所需的软件包。

如果是初学者,这尤其方便,但即使对于经验丰富的开发人员来说,这也是一种快速测试一些东西而无需单独安装每个包的方法。

Anaconda包括100个最流行的数据科学Python,R和Scala软件包以及Jupyter和Spyder等几个开源开发环境。如果想在本教程之后开始使用Jupyter Notebook,请转到此页面。

可以去安装Anaconda。按照说明进行安装,就可以开始了!

将Excel文件加载为Pandas DataFrames


python自动操作exe python自动操作excel_Python_08


pandas请参考python也能做excel大神之一:熊猫(pandas)的大用处

这么设置好环境就是完成了所需要做的一切!

现在,开始导入文件。

在使用它们进行数据科学时,经常用来导入文件的方法之一是调用Pandas软件包。Pandas库基于NumPy构建封装,为Python编程语言提供易于使用的数据结构和数据分析工具。

这个功能强大且灵活的库经常被数据科学家用来将他们的数据转化为对他们的分析具有高度表现力的数据结构。

如果已经通过Anaconda提供了Pandas,可以在Pandas DataFrames中加载的文件pd.Excelfile():

# Import pandas import pandas as pd # Assign spreadsheet filename to `file` file = 'example.xlsx' # Load spreadsheet xl = pd.ExcelFile(file) # Print the sheet names print(xl.sheet_names) # Load a sheet into a DataFrame by name: df1 df1 = xl.parse('Sheet1')

如果没有安装Anaconda,只需执行pip install pandas以在的环境中安装Pandas软件包,然后执行上面代码块中包含的命令。

小菜一碟,对吧?

如果要读入.csv文件,有一个类似的功能来加载DataFrame中的数据:read_csv()。以下是如何使用此功能的示例:

# Import pandas import pandas as pd # Load csv df = pd.read_csv("example.csv")

默认情况下,此函数将考虑的分隔符是逗号,但可以根据需要指定其他的分隔符。

注意,也有read_table()和read_fwf()功能在一般分隔文件和固定宽度格式化线成DataFrames的表来读取。对于第一个函数,默认分隔符是tab,但指定备用分隔符。此外,还可以使用其他函数在DataFrame中获取数据。

如何将Pandas DataFrames写入Excel文件

在分析数据后,希望将分析结果写回新文件。

这种方法可以将Pandas DataFrames写回文件,通过调用dataframe的to_excel()功能。

但是,在使用此功能之前,必须确认XlsxWriter如果要将数据写入.xlsx文件中的多个工作表,请确保已安装 :

# Install `XlsxWriter`
pip install XlsxWriter
# Specify a writer
writer = pd.ExcelWriter('example.xlsx', engine='xlsxwriter')
# Write your DataFrame to a file
yourData.to_excel(writer, 'Sheet1')
# Save the result
writer.save()

请注意,在上面的代码块中,使用一个ExcelWriter对象来输出DataFrame。

换句话说,将writer变量传递给to_excel()函数,并指定工作表名称。这样,可以将包含数据的工作表添加到现有工作簿:可以使用调用ExcelWriter将多个不同的DataFrame以不同工作簿方式保存到一个excel文件里。

这意味着,如果只想将一个DataFrame保存到文件中,也可以不安装XlsxWriter软件包。然后,只是不指定engine要传递给pd.ExcelWriter()函数的参数。其余步骤保持不变。

与以前在.csv文件中读取的函数类似,还可以to_csv()将结果写回逗号分隔文件。它的工作方式与使用它读取文件时的方式相同:

# Write the DataFrame to csv
df.to_csv("example.csv")

如果要使用制表符分隔文件,也可以将sep参数传递给参数以使其清晰。请注意,可以使用各种其他功能输出文件。。

用于解析Excel文件的其他python包

除了Pandas软件包(可能经常使用它来加载数据),还可以使用其他软件包来获取Python中的数据。对可用软件包的概述基于,其中包含可用于在Python中使用Excel文件的软件包列表。

在下文中,将看到如何在快捷迅速使用这些包。

使用虚拟环境

安装这些软件包的一般建议是在没有系统软件包的Python virtualenv中进行。可以使用virtualenv创建独立的Python环境:它创建一个文件夹,其中包含使用Python项目所需的软件包所需的所有可执行文件。

要开始使用virtualenv,首先需要安装它。然后,转到要放置项目的目录。在此文件夹中创建virtualenv,并在需要时加载特定的Python版本。然后,激活虚拟环境。之后,可以开始加载其他包,开始使用它们等。

提示:完成后别忘了停用环境!

# Install virtualenv $
pip install virtualenv
# Go to the folder of your project $
cd my_folder
# Create a virtual environment `venv` $
virtualenv venv
# Indicate the Python interpreter to use for `venv` $
virtualenv -p /usr/bin/python2.7 venv
# Activate `venv` $
source venv/bin/activate
# Deactivate `venv` $
deactivate

请注意,当刚刚开始使用Python创建数据科学项目时,虚拟环境可能看起来有点麻烦。特别的,当只有一个项目要考虑时,可能根本不清楚为什么需要一个虚拟环境。

但是考虑当有多个项目同时运行并且不希望它们共享相同的Python安装时会有多容易。或者当的项目有相互冲突的要求时,虚拟环境就会派上用场!

现在,最终可以开始安装和导入已阅读的要在电子表格数据中加载的软件包。

如何读取和写入Excel文件 openpyxl

一般建议使用此包,如果想读,写 .xlsx, xlsm,xltx和xltm文件。

安装openpyxl使用pip:在上一节中看到了如何操作!

安装此软件包的一般建议是在没有系统软件包的Python虚拟环境中执行此操作。可以使用虚拟环境创建独立的Python环境:它创建一个文件夹,其中包含使用Python项目所需的所有必需的可执行文件。

转到项目所在的目录,然后重新激活虚拟环境venv。然后进行安装openpyxl使用pip,以确保可以读取和写入它的文件:

# Activate virtualenv $source activate venv# Install `openpyxl` in `venv` $pip install openpyxl

现在已经安装了openpyxl,可以开始加载数据。

但究竟是什么数据呢?

包含尝试在Python中获取的数据的工作簿具有以下表单:

load_workbook()正如所见,该函数将文件名作为参数,并返回一个workbook表示文件的对象。可以通过运行来检查type(wb)。请务必确保位于数据所在的目录中。否则,导入时会出错!

# Import `load_workbook` module from `openpyxl` from openpyxl import load_workbook # Load in the workbook wb = load_workbook('./test.xlsx') # Get sheet names print(wb.get_sheet_names())

请记住,可以借助于更改工作目录os.chdir()。

会看到上面的代码块返回在Python中加载的工作簿的工作表名称。接下来,可以使用此来检索工作簿的单独工作表。

还可以检查当前处于活动状态的工作表wb.active。正如在下面的代码中看到的,还可以使用它来加载工作簿中的另一个工作表:

# Get a sheet by name sheet = wb.get_sheet_by_name('Sheet3') # Print the sheet title sheet.title # Get currently active sheet anotherSheet = wb.active # Check `anotherSheet` anotherSheet

可以使用方括号从工作簿工作表中的某些单元格中检索值,可以[]从中传递要从中检索值的确切单元格。

请注意,这看起来非常类似于利用索引选择,获取和索引NumPy数组和Pandas DataFrames,如果需要获取sheet的数值; 需要添加属性value:

# Retrieve the value of a certain cell sheet['A1'].value # Select element 'B2' of your sheet c = sheet['B2'] # Retrieve the row number of your element c.row # Retrieve the column letter of your element c.column # Retrieve the coordinates of the cell c.coordinate

可以看到,除了value,还有,可以用它来检查的列和当前工作区域名称等,即其他属性 row,column和coordinate。

· 该row属性将返回2;

· 添加column属性c将给'B',和

· 该coordinate会给予回复'B2'。

还可以使用该cell()函数检索单元格值。传递row和column参数,并将值添加到这些参数,这些参数对应于要检索的单元格的值,当然,要访问具体的数值不要忘记添加属性value:

# Retrieve cell value sheet.cell(row=1, column=2).value # Print out values in column 2 for i in range(1, 4):  print(i, sheet.cell(row=i, column=2).value)

请注意,如果未指定该属性value,则会返回,但不会告诉有关该特定单元格中包含的值的任何信息。

可以看到在range()函数的帮助下使用for循环来帮助打印出第2列中具有值的行的值。如果这些特定单元格为空,将返回None。如果想了解有关for循环的更多信息,请考虑参加小白打卡社群课程。

更重要的是,还有一些特殊功能可以调用以获取某些其他值,例如get_column_letter()和column_index_from_string。

这两个函数已经或多或少地说明了可以使用它们检索的内容,但为了清楚起见,最好使它们明确:虽然可以用前者检索列的字母,可以反过来或得到一个索引将字母传递给后者时的列。可以在下面看到它的工作原理:

# Import relevant modules from `openpyxl.utils` from openpyxl.utils import get_column_letter, column_index_from_string # Return 'A' get_column_letter(1) # Return '1' column_index_from_string('A')

已经检索了在特定列中具有值的行的值,但是如果要打印文件的行而不是仅关注单个列,则需要执行哪些操作?

使用另一个for循环!

例如,想要把重点放在位于之间的区域'A1'和'C3',其中第一个指定左上角和第二上要重点区域的右下角的区域内。

这个区域将是cellObj在下面第一行代码中看到的特定区域。

然后,对于位于该区域的每个单元格,可以打印坐标和该单元格中包含的值。在每行结束后,将打印一条消息,表示该cellObj区域的行已被打印。

# Print row per row for cellObj in sheet['A1':'C3']:  for cell in cellObj:  print(cells.coordinate, cells.value)  print('--- END ---')

再次注意,区域的选择与选择,获取和索引列表以及NumPy数组元素非常相似,还可以使用方括号和冒号:来指示要获取值的区域。另外,上面的循环也很好地利用了cell属性!

要使上述说明和代码可视化,可能需要查看循环结束后将返回的结果:

('A1', u'M') ('B1', u'N') ('C1', u'O') --- END --- ('A2', 10L) ('B2', 11L) ('C2', 12L) --- END --- ('A3', 14L) ('B3', 15L) ('C3', 16L) --- END ---

最后,可以使用一些属性来检查核验导入的结果,即max_row和max_column。这些属性当然是确保正确加载数据的一般方法,而且,它们将会非常有用。

# Retrieve the maximum amount of rows
sheet.max_row
# Retrieve the maximum amount of columns
sheet.max_column

OK,但相对于pandas的使用而言,这些仍然比较繁复

openpyxl支持Pandas DataFrames!可以使用DataFrame()Pandas包中的函数将工作表的值放入DataFrame:

# Import `pandas` import pandas as pd # Convert Sheet to DataFrame df = pd.DataFrame(sheet.values)

如果要指定标题和索引,则需要添加更多代码:

# Put the sheet values in `data` data = sheet.values # Indicate the columns in the sheet values cols = next(data)[1:] # Convert your data to a list data = list(data) # Read in the data at index 0 for the indices idx = [r[0] for r in data] # Slice the data at index 1 data = (islice(r, 1, None) for r in data) # Make your DataFrame df = pd.DataFrame(data, index=idx, columns=cols)

接下来,可以开始使用Pandas包提供的所有功能来操作数据。但是,请记住,处于虚拟环境中,因此如果该软件包尚不存在,需要再次安装它pip。

要将Pandas DataFrames写回Excel文件,可以轻松使用模块中的dataframe_to_rows()函数utils:

# Import `dataframe_to_rows` from openpyxl.utils.dataframe import dataframe_to_rows # Initialize a workbook wb = Workbook() # Get the worksheet in the active workbook ws = wb.active # Append the rows of the DataFrame to your worksheet for r in dataframe_to_rows(df, index=True, header=True):  ws.append(r)

该 openpyxl 软件包为提供了将数据写回Excel文件,更改单元格样式的高度灵活性,这使其成为经常使用电子表格时必用的软件包之一。

提示:阅读更多有关如何更改单元格样式,更改为只写模式或此程序包如何与NumPy一起使用的详细 。

现在,看一下其他一些可用于在Python中获取电子表格数据的软件包。

在关闭本节之前, 请记住在完成后不要忘记停用虚拟环境!

准备好了吗?

读取和格式化Excel文件: xlrd

如果想从带有.xls或.xlsx扩展名的文件中读取数据和格式化数据,那么此软件包是理想的选择。

# Import `xlrd` import xlrd # Open a workbook workbook = xlrd.open_workbook('example.xls') # Loads only current sheets to memory workbook = xlrd.open_workbook('example.xls', on_demand = True)

如果不想读取整个工作簿,需要使用诸如sheet_by_name()或之类的函数sheet_by_index()来检索希望在分析中使用的工作表。

# Load a specific sheet by name worksheet = workbook.sheet_by_name('Sheet1') # Load a specific sheet by index worksheet = workbook.sheet_by_index(0) # Retrieve the value from cell at indices (0,0) sheet.cell(0, 0).value

可以看到可以从工作表中检索某些坐标值(使用索引表示)。

继续xlwt并xlutils了解更多关于它们与xlrd包装的关系!

欢迎加入python每日打卡群。

将数据写入Excel文件 xlwt

如果要创建包含数据的电子表格xlwt,除了包之外,还可以使用该XlsxWriter包。xlwt非常适合将数据和格式信息写入带.xls扩展名的文件。

当手动想要写入文件时,调用方式如下:

# Import `xlwt` import xlwt # Initialize a workbook book = xlwt.Workbook(encoding="utf-8") # Add a sheet to the workbook sheet1 = book.add_sheet("Python Sheet 1") # Write to the sheet of the workbook sheet1.write(0, 0, "This is the First Cell of the First Sheet") # Save the workbook book.save("spreadsheet.xls")

如果想将数据写入文件,但是不想自己完成所有事情的麻烦,可以求助于for循环来自动化整个过程。编写一个脚本,在其中初始化工作簿并向其添加工作表。指定包含列的列表和包含将在工作表中填充的值的列表。

接下来,有一个for循环,它将确保所有值都进入文件:说对于0到4范围内的每个元素(5不包括在内),会做一些事情。将逐行填写值。要执行此操作,请指定row在每个循环处跳转的元素。接下来,将有另一个for循环,它将遍历工作表的列。说对于工作表中的每一行,将查看与其一起使用的列,并且将为该行中的每一列填充一个值。当使用值填充行的所有列时,将转到下一行,直到没有剩余行。

# Initialize a workbook book = xlwt.Workbook() # Add a sheet to the workbook sheet1 = book.add_sheet("Sheet1") # The data cols = ["A