数据导入和导出

现实中处理数据,要处理的数据通常以文件的形式存储。所以处理数据的第一步,是要将数据从文件导入到内存。数据处理完后,需要将处理结果存储到文件,所以要导出。[大谦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  财务部  陈东  510321197810030016  女
1  1002  财务部  田菊  412823198005251008  男
2  1003  生产部  王伟  430225198003113024  男
3  1004  生产部  韦龙  430225198511163008  女
4  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  财务部  陈东  510321197810030016  女
1002  财务部  田菊  412823198005251008  男
1003  生产部  王伟  430225198003113024  男
1004  生产部  韦龙  430225198511163008  女
1005  销售部  刘洋  430225198008123008  女, 1:        部门   姓名                身份证号 性别
工号
1006  生产部   吕川  320325197001017024  女
1007  销售部   杨莉  420117197302174976  男
1008  财务部   夏东  132801194705058000  女
1009  销售部   吴晓  430225198001153024  男
1010  销售部  宋恩龙  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  财务部   陈东  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')

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