现实中处理数据,要处理的数据通常以文件的形式存储。所以处理数据的第一步,是要将数据从文件导入到内存。数据处理完后,需要将处理结果存储到文件,所以要导出。[大谦MATLAB,dqmatlab点com]
导入文件数据
MATLAB和Python都提供了专门的函数导入文件数据。
【MATLAB】
MATLAB中用readtable函数导入文件数据。该函数可以读取一下格式的数据文件:
.txt、.dat 或 .csv(带分隔符的文本文件)
.xls、.xlsb、.xlsm、.xlsx、.xltm、.xltx 或 .ods(电子表格文件)
.xml(可扩展标记语言 (XML) 文件)
.docx(Microsoft® Word 文档文件)
.html、.xhtml 或 .htm(超文本标记语言 (HTML) 文件)
readtable函数的语法格式为:
T=readtable(filename) 通过从文件中读取列数据来创建表。
T=readtable(filename,opts) 使用导入选项 opts 创建表。
T=readtable(___,Name,Value) 基于文件创建一个表,并通过一个或多个名称-值匹配对组成的参数指定其他选项。例如,可以指定 readtable 是将文件的第一行读取为变量名称还是数据。
要为数据设置特定的导入选项,您可以使用 opts 对象,也可以指定名称-值对组。
下面用readtable函数将D盘下的Excel文件“身份证号.xlsx”读取到表T。设置“VariableNamingRule”参数的值为“preserve”,将第1个工作表中的第1行作为表的索引行,设置“ReadRowNames”参数的值为true,将第1列“工号”作为表的索引列。在命令窗口输入:
>> T=readtable('D:\身份证号.xlsx','VariableNamingRule','preserve','ReadRowNames',true)
T =
5×4 table
部门 姓名 身份证号 性别
_________ ________ ______________________ ______
1001 {'财务部'} {'陈东'} {'5103211978100300**'} {'女'}
1002 {'财务部'} {'田菊'} {'4128231980052512**'} {'男'}
1003 {'生产部'} {'王伟'} {'4302251980031135**'} {'男'}
1004 {'生产部'} {'韦龙'} {'4302251985111635**'} {'女'}
1005 {'销售部'} {'刘洋'} {'4302251980081235**'} {'女'}
默认时读取工作簿中第1个工作表的数据。如果需要读取其他工作表的数据,用“Sheet”参数指定该工作表的编号或名称。下面读取第2个工作表的数据。
>> T2=readtable('D:\身份证号.xlsx','VariableNamingRule','preserve','ReadRowNames',true,'Sheet',2)
T2 =
5×4 table
部门 姓名 身份证号 性别
_________ _________ ______________________ ______
1006 {'生产部'} {'吕川' } {'3203251970010171**'} {'女'}
1007 {'销售部'} {'杨莉' } {'4201171973021753**'} {'男'}
1008 {'财务部'} {'夏东' } {'1328011947050583**'} {'女'}
1009 {'销售部'} {'吴晓' } {'4302251980011535**'} {'男'}
1010 {'销售部'} {'宋恩龙'} {'3203251980010181**'} {'女'}
【Python】
利用pandas包的read_excel方法读取Excel数据。该方法的参数比较多,常用的参数如表11-1中所示。利用这些参数,可以导入规整数据,也可以处理很多不规范的Excel数据。导入后的数据为DataFrame类型的数据。
表11-1 read_excel方法的部分参数
| 参 数 | 说 明 |
|---|---|
| io | Excel文件的路径和名称 |
| sheet_name | 读取数据的工作表的名称,可以指定名称,也可以指定索引号,不指定时读取第1个工作表 |
| header | 指定用哪行数据作为索引行,如果是多层索引,用多行的行号组成列表进行指定 |
| index_col | 指定用哪列数据作为索引列,如果是多层索引,用多列的列号或名称组成列表进行指定 |
| usecols | 如果只需要导入原始数据中的部分列数据,使用该参数用列表进行指定 |
| dtype | 用字典指定特定列的数据类型,如{'A':np.float64 }指定A列的数据类型为64位浮点型 |
| nrows | 指定需要读取的行数 |
| skiprows | 指定读入时忽略前面多少行 |
| skip_footer | 指定读入时忽略后面多少行 |
| names | 用列表指定列的列索引标签 |
| engine | 执行数据导入的引擎,如'xlrd', 'openpyxl'等 |
注意:使用read_excel方法导入数据时有时会出现类似没有安装xlrd的错误以及其他各种错误。建议安装openpyxl,在使用read_excel方法时指定engine参数的值为"openpyxl"。
假设D盘下有一个Excel文件“D:\身份证号.xlsx”,该文件工作簿中有2个工作表,保存的是部分工作人员的身份信息。现在用pandas包的read_excel方法导入该文件中的数据。
>>> df=pd.read_excel(io='D:\身份证号.xlsx',engine='openpyxl')
>>> df
工号 部门 姓名 身份证号 性别
0 1001 财务部 陈东 510321197810030016 女
1 1002 财务部 田菊 412823198005251008 男
2 1003 生产部 王伟 430225198003113024 男
3 1004 生产部 韦龙 430225198511163008 女
4 1005 销售部 刘洋 430225198008123008 女
默认时导入第1个工作表中的数据,将第1行数据作为表头,即列索引标签。行索引从0开始自动对行进行编号。
使用sheet_name参数可以指定打开某一个或多个工作表,用index_col参数指定某列作为行索引。下面同时打开前两个工作表,指定“工号”列作为行索引。
>>> df=pd.read_excel(io='D:\身份证号.xlsx',sheet_name=[0,1],index_col='工号',engine='openpyxl')
>>> df
{0: 部门 姓名 身份证号 性别
工号
1001 财务部 陈东 510321197810030016 女
1002 财务部 田菊 412823198005251008 男
1003 生产部 王伟 430225198003113024 男
1004 生产部 韦龙 430225198511163008 女
1005 销售部 刘洋 430225198008123008 女, 1: 部门 姓名 身份证号 性别
工号
1006 生产部 吕川 320325197001017024 女
1007 销售部 杨莉 420117197302174976 男
1008 财务部 夏东 132801194705058000 女
1009 销售部 吴晓 430225198001153024 男
1010 销售部 宋恩龙 320325198001017984 女}
现在同时导入了两个工作表中的数据,并且将“工号”列数据进行行索引。可见,此时返回的结果为字典类型,字典中键值对的键为工作表的索引号,值为工作表的数据,为DataFrame类型。可以用type函数查看数据类型。
>>> type(df[0])
<class 'pandas.core.frame.DataFrame'>
其他参数请自行测试,比如选择列数据、忽略前面的部分行或后面的部分行、给没有列索引标签的数据添加标签等。
导出数据到文件
MATLAB和Python pandas包都提供了将表或DataFrame数据导出到Excel文件的函数。
【MATLAB】
MATLAB中使用writetable函数将表数据导出到文本文件或Excel等类型的文件。该函数的语法格式为:
writetable(T) 将表T写入到一个逗号间隔的文本文件。文件名为表对应的工作空间变量名,扩展名为.txt。如果无法创建文件名,则写入table.txt。
writetable(T,filename) 用filename指定要写入的文件的名称和扩展名。
writetable(___,Name,Value) 用一个或多个名称-值匹配对指定的选项将表写入文件。
10.3.1小节将Excel文件中第1个工作表和第2个工作表中的数据分别读取到表T和T2中,下面将表T和T2合并到表3,然后将表3保存到D盘下的Excel文件“身份证号2.xlsx”。
>> T3=[T;T2]
T3 =
10×4 table
部门 姓名 身份证号 性别
_________ _________ ______________________ ______
1001 {'财务部'} {'陈东' } {'5103211978100300**'} {'女'}
1002 {'财务部'} {'田菊' } {'4128231980052512**'} {'男'}
1003 {'生产部'} {'王伟' } {'4302251980031135**'} {'男'}
1004 {'生产部'} {'韦龙' } {'4302251985111635**'} {'女'}
1005 {'销售部'} {'刘洋' } {'4302251980081235**'} {'女'}
1006 {'生产部'} {'吕川' } {'3203251970010171**'} {'女'}
1007 {'销售部'} {'杨莉' } {'4201171973021753**'} {'男'}
1008 {'财务部'} {'夏东' } {'1328011947050583**'} {'女'}
1009 {'销售部'} {'吴晓' } {'4302251980011535**'} {'男'}
1010 {'销售部'} {'宋恩龙'} {'3203251980010181**'} {'女'}
>> writetable(T3,'D:\身份证号2.xlsx')
【Python】
使用DataFrame对象的to_excel方法将DataFrame数据写入到Excel文件。比如上面导入了前两个工作表的数据,现在希望将这两个工作表的数据合并后保存到另外一个Excel文件中。使用pandas包的concat方法垂向拼接两个工作表的数据,然后保存到D盘下的new_file.xlsx文件中。
>>> df1=df[0]
>>> df2=df[1]
>>> df0=pd.concat([df1,df2])
>>> df0
部门 姓名 身份证号 性别
工号
1001 财务部 陈东 510321197810030016 女
1002 财务部 田菊 412823198005251008 男
1003 生产部 王伟 430225198003113024 男
1004 生产部 韦龙 430225198511163008 女
1005 销售部 刘洋 430225198008123008 女
1006 生产部 吕川 320325197001017024 女
1007 销售部 杨莉 420117197302174976 男
1008 财务部 夏东 132801194705058000 女
1009 销售部 吴晓 430225198001153024 男
1010 销售部 宋恩龙 320325198001017984 女
>>> df0.to_excel('D:\\new_file.xlsx')
合并后的数据被正确保存到指定文件中。