数据导入和导出

现实中处理数据,要处理的数据通常以文件的形式存储。所以处理数据的第一步,是要将数据从文件导入到内存。数据处理完后,需要将处理结果存储到文件,所以要导出。[大谦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列“工号”作为表的索引列。在命令窗口输入:

code.matlab
>> 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个工作表的数据。

code.matlab
>> 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方法导入该文件中的数据。

code.python
>>> df=pd.read_excel(io='D:\身份证号.xlsx',engine='openpyxl')
>>> df
     工号   部门  姓名                身份证号 性别
0  1001  财务部  陈东  5103211978100300161  1002  财务部  田菊  4128231980052510082  1003  生产部  王伟  4302251980031130243  1004  生产部  韦龙  4302251985111630084  1005  销售部  刘洋  430225198008123008

默认时导入第1个工作表中的数据,将第1行数据作为表头,即列索引标签。行索引从0开始自动对行进行编号。

使用sheet_name参数可以指定打开某一个或多个工作表,用index_col参数指定某列作为行索引。下面同时打开前两个工作表,指定“工号”列作为行索引。

code.python
>>> df=pd.read_excel(io='D:\身份证号.xlsx',sheet_name=[0,1],index_col='工号',engine='openpyxl')
>>> df
{0:        部门  姓名                身份证号 性别
工号
1001  财务部  陈东  5103211978100300161002  财务部  田菊  4128231980052510081003  生产部  王伟  4302251980031130241004  生产部  韦龙  4302251985111630081005  销售部  刘洋  430225198008123008  女, 1:        部门   姓名                身份证号 性别
工号
1006  生产部   吕川  3203251970010170241007  销售部   杨莉  4201171973021749761008  财务部   夏东  1328011947050580001009  销售部   吴晓  4302251980011530241010  销售部  宋恩龙  320325198001017984  女}

现在同时导入了两个工作表中的数据,并且将“工号”列数据进行行索引。可见,此时返回的结果为字典类型,字典中键值对的键为工作表的索引号,值为工作表的数据,为DataFrame类型。可以用type函数查看数据类型。

code.python
>>> 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”。

code.matlab
>> 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文件中。

code.python
>>> df1=df[0]
>>> df2=df[1]
>>> df0=pd.concat([df1,df2])
>>> df0
       部门   姓名                身份证号 性别
工号
1001  财务部   陈东  5103211978100300161002  财务部   田菊  4128231980052510081003  生产部   王伟  4302251980031130241004  生产部   韦龙  4302251985111630081005  销售部   刘洋  4302251980081230081006  生产部   吕川  3203251970010170241007  销售部   杨莉  4201171973021749761008  财务部   夏东  1328011947050580001009  销售部   吴晓  4302251980011530241010  销售部  宋恩龙  320325198001017984>>> df0.to_excel('D:\\new_file.xlsx')

合并后的数据被正确保存到指定文件中。