【发布时间】:2022-01-09 10:18:30
【问题描述】:
我正在努力编写一个 for 循环来将大约 100 个 .dat 文件转换为 .csv。
我的.dat 文件如下所示:
% Filename : Spm04A1_00288_00001.tif
% Date & Time : 26-Oct-2021 15:45:01
% X-ray Energy (keV) : 20.000
% Exposure Time (s) : 1.030
% Beam Center : 718.20700, 1572.10000
% Sample to Detector Distance (SDD) (mm) : 2175.520
% Detector Pixel Size (mm) : 0.146
% Photodiode Value : 176453.000
% 10 of Sample : 198187
% 10 of Standard : 1
% q(A^-1) I(q) sqrt(I(q))
0.00000000e+00 0.00000000e+00 0.00000000e+00
6.78047596e-04 0.00000000e+00 0.00000000e+00
1.35609519e-03 0.00000000e+00 0.00000000e+00
2.03414279e-03 0.00000000e+00 0.00000000e+00
2.71219038e-03 0.00000000e+00 0.00000000e+00
3.39023798e-03 0.00000000e+00 0.00000000e+00
4.06828558e-03 0.00000000e+00 0.00000000e+00
4.74633317e-03 0.00000000e+00 0.00000000e+00
5.42438077e-03 0.00000000e+00 0.00000000e+00
6.10242836e-03 0.00000000e+00 0.00000000e+00
6.78047596e-03 0.00000000e+00 0.00000000e+00
7.45852356e-03 0.00000000e+00 0.00000000e+00
8.13657115e-03 0.00000000e+00 0.00000000e+00
8.81461875e-03 9.12221748e+00 3.23146137e+00
9.49266634e-03 8.47547513e+00 1.27051027e+00
数据文件由三列 X 射线散射数据组成(scattering vector、intensity 和 sqrt(intensity)。它们是从最近一次散射旅行中收到的原始数据文件。为了处理这些其他软件中的数据文件,我需要将它们转换为.csv。
我能够使用此代码编辑一个文件(并添加标题):
headerList = ['q(A^-1)', 'I(q)', 'sqrt(I(q))']
data.to_csv("Spm04A3_00258_00001.csv", header=headerList, index=False)
data2 = pd.read_csv("Spm04A3_00258_00001.csv")
print('\nModified file:')
print(data2)
不幸的是,这对于转换 100 个数据文件效率不高,但我真的很难编写循环。如有任何建议,我将不胜感激。
【问题讨论】:
-
我添加了使用文本编辑器打开的 .dat 文件的屏幕截图。我不确定这是否有帮助?
-
您最好使用命令行工具,例如
awk/gawk或sed。 -
顺便说一句,如果您运行的是 Linux,这可以通过 bash 中的这一行轻松完成:
for f in *.dat ; do echo "q(A^-1),I(q),sqrt(I(q))" > "$f.csv" && tail -n+2 $f | awk '{print $1","$2","$3}' >> $f.csv; done这很有效,因为您的场景仅使用数字数据,这允许使用简单的字符串操作。或者就像@Tony 写的那样——用一个简单的sed 's/\w+/,/' $f > "$f.csv" -
您发布的图片中的数据似乎已经是
CSV格式。您只需要知道每个记录使用什么字符作为分隔符。 -
我有没有提到你是我的英雄,@accdias?大声笑