mathematica将数据格式化写入到文件很麻烦
mathematica吧
全部回复
仅看楼主
level 6
纯小树 楼主
mathemtaica将数据(包括数字,字符串等),格式化地写入到文件中,操作起来很麻烦。用Export数据长短不一,精度难以控制,用底层文件操作,流的方式,仍然是难以实现,而且难以将数据对齐。不知道谁有什么好的方法没有。
2019年12月06日 11点12分 1
吧务
level 15
……请举个具体点的例子。
2019年12月07日 11点12分 2
可以参考楼下例子。
2019年12月07日 13点12分
level 6
纯小树 楼主
网页编辑,格式不好对齐,我就上截图了:
文本也贴上:
回复楼上:
就比如我得到的数据是这样:
{{"Hello","World"},
{1.123132412,2.12312,3.1231241224,"abc","def"},
{4.2351111,-2.234,-2.35533123,"det","dgd"}}
我想写入到文件中,且格式是这样的:
Hello World
1.123 2.123 3.123 abc def
4.235 -2.234 -2.355 det dgd
不是说我用mathemtica不能实现,只不过操作起来会相当麻烦。这一点用python等就比较好实现点。
2019年12月07日 13点12分 5
……你文本里的对齐方式和截图里不一样啊。负号到底对哪里?
2019年12月07日 14点12分
截图里感觉是对齐在小数点处,但是又有点歪。
2019年12月07日 14点12分
@xzcyr 对齐方式是负号往前一格,用网页文本编辑,连打两个空格,发出后就又变成一个空格了,所以对齐方式无法显示。抱歉,我应该用专门的文本编辑器编辑后截图的。
2019年12月08日 00点12分
吧务
level 15
总之给个对文本部分的处理。至于算不算“相当麻烦”这就见仁见智了。你不妨也贴一下python的方法。
SetAttributes[format, Listable]
format[a_?NumericQ] := NumberForm[a, 4]
format[a_] := a
Export["a.txt", {{"Hello", "World"}, {1.123132412, 2.12312, 3.1231241224, "abc",
"def"}, {4.2351111, -2.234, -2.35533123, "det", "dgd"}} // format, "Table", "FieldSeparators" -> " "] // SystemOpen
2019年12月07日 14点12分 6
实验了下,感觉楼上截图的效果比较像是NumberForm添加 NumberSigns -> {"-", " "} 后的效果。
2019年12月07日 14点12分
[大拇指][大拇指][大拇指]确实厉害!佩服佩服!这里你这么处理,的确很高明!我导出比较大的数据文件的时候,用Export就很容易出现卡死等情况,所以我会用Stream的方式导出数据。这样情况就又复杂了。用python的话,其print函数比较底层,像负号不影响对齐等,都是"% .16f",在百分号后多打个空格就可以了。
2019年12月08日 00点12分
还有就是,mathemtaica会自动将一些数字转换为科学计数法,要用NumberForm改成特定位小数,还要再加参数,不然格式会混乱。 而对于整数,要用NumberForm改成浮点数,好像也比较麻烦,除非用1.去乘原始数据,但总感觉不是那么回事。
2019年12月08日 00点12分
楼下贴上python代码及运行结果。
2019年12月08日 01点12分
level 6
纯小树 楼主
数据量大(比如上万行的数据)且情况复杂的话,优势好像就更加明显了。
2019年12月08日 01点12分 7
吧务
level 9
(*data=RandomReal[{-1,1},{10000,10}];*)
data={{"Hello","World"},{1.123132412,2.12312,3.1231241224,"abc","def"},{4.2351111,-2.234,-2.35533123,"det","dgd"}};
str=Row[#," "]&/@data//Column//NumberForm[DecimalForm[#],4]&//ToString;
Export["test.txt",str]
这种方法可以处理有科学计数法的情况,而且速度快一些
2019年12月08日 08点12分 8
嗯嗯。感谢!其实NumberForm也有专门的参数ScientificNotationThreshold来提高使用科学计数法的门槛。采用DecimalForm的话,参数NumberSigns好像会不起作用,即有负数的话,负号的对齐会出现问题。
2019年12月08日 08点12分
你可以尝试下这个例子的数据,最后把listout格式化输出到文件: listtemp = RandomReal[{-3, 3}, {100000, 3}]; listout = Join[{{"Hello", "World"}}, Join[listtemp, Table[{"x", "y", "z"}, {i, 1, 100000}], 2]];
2019年12月08日 09点12分
level 6
纯小树 楼主
非常感谢楼上的帮助。下边介绍我的方法,通过比较,我还是觉得此方法写文件效率最高:
WriteLine[filename,
StringReplace[
ToString[
NumberForm[data, {16, 16},
NumberSigns -> {"-", " "},
ScientificNotationThreshold -> {-20, 10}]], {"{" -> "",
"}" -> "", "," -> " "}]]
如例,我是采用比较底层的文件操作方法,用时2.9s,进行写入操作。
2019年12月08日 09点12分 9
吧务
level 9
str=StringReplace[ToString@NumberForm[listout,{16,16},NumberSigns->{"-"," "},ScientificNotationThreshold->{-20,10}],{"{"->"","}, "|"}}"->"\n",","->" "}];
Export["test2.dat",str]
这样效率更高一些,同样的数据楼上的代码需要2.9秒,这个需要0.84秒。
2019年12月08日 10点12分 10
[大拇指]哈哈,我又试了下,之前2.9s那是因为我把表达式转字符串的工作放在WriteLine里的原因。先转成字符串,再写入文件就好了。看来要想写文件效率高,关键还是先将数据格式处理好,转换成字符串呀。
2019年12月08日 11点12分
看来我一直认为Export不行,也是误会它了。
2019年12月08日 11点12分
@纯小树 Export的重载很多,有些用法确实效率不高,导出为字符串还好
2019年12月08日 12点12分
2019年12月09日 00点12分
1