Python 从多个文本文件中将具有设定行数的数据列拉入一个文本文件
我有几百个文本文件。我想提取一个特定的列,其中包含一定数量的行。这些文件完全相同,唯一不同的是数据值。我想将这些数据放入一个新的文本文件中,每个新列都位于前一列之前 该文件是一个.sed文件,与.txt文件基本相同。这就是它看起来的样子。该文件实际上来自Wvl 350-2150Python 从多个文本文件中将具有设定行数的数据列拉入一个文本文件,python,matlab,Python,Matlab,我有几百个文本文件。我想提取一个特定的列,其中包含一定数量的行。这些文件完全相同,唯一不同的是数据值。我想将这些数据放入一个新的文本文件中,每个新列都位于前一列之前 该文件是一个.sed文件,与.txt文件基本相同。这就是它看起来的样子。该文件实际上来自Wvl 350-2150 Comment: Version: 2.2 File Name: C:\Users\HyLab\Desktop\Curtis Bernard\PSR+3500_1596061\PSR+3500_1596061\201
Comment:
Version: 2.2
File Name: C:\Users\HyLab\Desktop\Curtis
Bernard\PSR+3500_1596061\PSR+3500_1596061\2019_Feb_16\Contact_00186.sed
<Metadata>
Collected By:
Sample Name:
Location:
Description:
Environment:
</Metadata>
Instrument: PSR+3500_SN1596061 [3]
Detectors: 512,256,256
Measurement: REFLECTANCE
Date: 02/16/2019,02/16/2019
Time: 13:07:52.66,13:29:17.00
Temperature (C): 31.29,8.68,-5.71,31.53,8.74,-5.64
Battery Voltage: 7.56,7.20
Averages: 10,10
Integration: 2,2,2,10,8,2
Dark Mode: AUTO,AUTO
Foreoptic: PROBE {DN}, PROBE {DN}
Radiometric Calibration: DN
Units: None
Wavelength Range: 350,2500
Latitude: n/a
Longitude: n/a
Altitude: n/a
GPS Time: n/a
Satellites: n/a
Calibrated Reference Correction File: none
Channels: 2151
Columns [5]:
Data:
Chan.# Wvl Norm. DN (Ref.) Norm. DN (Target) Reflect. %
0 350.0 1.173460E+002 1.509889E+001 13.7935
1 351.0 1.202493E+002 1.529762E+001 13.6399
2 352.0 1.232869E+002 1.547818E+001 13.4636
3 353.0 1.264006E+002 1.563467E+001 13.2665
4 354.0 1.294906E+002 1.578425E+001 13.0723
在MATLAB R2016b或更高版本中,最简单的方法是使用
readtable
:
t = readtable('file.sed', delimitedTextImportOptions( ...
'NumVariables', 5, 'DataLines', 36, ...
'Delimiter', ' ', 'ConsecutiveDelimitersRule', 'join'));
在哪里
是文件名file.sed
'NumVariables',5表示有5列数据
表示数据从第36行开始,一直到文件末尾'DataLines',36
“Delimiter”表示分隔列的字符是空格
“连续delimitersrule”、“join”表示将多个空格视为一个空格(而不是将空数据列分开)
delimitedTextImportOptions
的帮助,或者作为替代方法,fixedWidthImportOptions
现在你有了一个MATLAB表格,有五列,其中第2列是波长,第5列是反射率,我想这就是你想要的?您可以使用
t(:,5)
因此,要将所有反射率列收集到一个表中,您可以执行以下操作
fileList = something % get the list of files from somewhere - say as a string array or a cell array of char
resultTable = table;
for ii = 1:numel(fileList)
sedFile = fileList{ii};
t = readtable(sedFile, delimitedTextImportOptions( ...
'NumVariables', 5, 'DataLines', 36, ...
'Delimiter', ' ', 'ConsecutiveDelimitersRule', 'join'));
t.Properties.VariableNames{5} = sprintf('Reflectance%d', ii);
resultTable = [resultTable, t(:,5)];
end
t.Properties.VariableNames…
行就在那里,因为t
的第5列每次都会被调用Var5
,但在结果表中,每个变量名称都必须是唯一的。在这里,我们将重命名输出表变量Reflectance1
,Reflectance2
等,但您可以将其更改为您想要的任何名称-可能是来自sedFile
的实际文件名-只要它是有效的唯一变量名
最后,您可以使用
writetable
将结果表保存到文本文件中。有关如何使用它的信息,请参见MATLAB帮助。在Python 3.x和numpy中:
import numpy as np
file_list = something # filenames in a Python list
result_array = None
for sed_file in file_list:
reflectance_column = np.genfromtxt(sed_file, skip_header=35, usecols=4)
result_array = (reflectance_column if result_array is None else
np.column_stack((result_array, reflectance_column)))
np.savetxt('outputfile.txt', result_array)
这里
忽略前35行skip_header=35
仅返回第5列(Python使用基于零的索引)usecols=4
- 有关更多详细信息,请参阅
Wvl
代表“波长”,而350.0、351.0、
是以nm为单位的波长。我在这方面遇到了问题……我认为是文件列表部分。我不知道你把文件列表作为字符串数组是什么意思。我正在输入….fileList='C:data'..这就是我的文件所在的位置,我在t=readtable(sedFile,…)处遇到一个错误。显示的错误消息说它无法找到或打开'C',我以为您想处理文件列表,所以答案中的代码需要一个字符向量,例如{'file1.sed',file2.sed'}
,或例如[“file1.sed”、“file2.sed”]
-如果您对这些帮助文件不清楚,请查看链接的帮助文件。'C:data'
不是这些东西,而是一个字符向量。您是否尝试了给出错误的行并检查了sedFile
的值是多少?如果您想获得当前fo中所有扩展名为.sed
的文件的列表使用类似于d=dir('*.sed')
的命令,然后是fileList={d.name}
.d=dir('*.sed');fileList=(string({d.name}));fileListB=pad(fileList,30);resultTable=table;对于ii=1:numel(fileListB)sedFile=fileListB(ii);t=readtable(sedFile,delimitedtextimportions)(…'NumVariables',5',DataLines',34,…'Whitespace',''Delimiter','\t','concedutivedelimitersrule','join');t.Properties.VariableNames{5}=sprintf('reflective%d',ii);resultable=[resultable,t(:,5)];end writetable(resultable,'Output.csv'));注释部分并没有真正让它变得容易,但这就是我最后所做的,它工作了!感谢您的帮助…目录中出现了一个问题,没有正确设置字符串数组的格式,然后是.sed文件和空格,在开始时在输出中添加了一个额外的列,因此必须对此进行解释。
import numpy as np
file_list = something # filenames in a Python list
result_array = None
for sed_file in file_list:
reflectance_column = np.genfromtxt(sed_file, skip_header=35, usecols=4)
result_array = (reflectance_column if result_array is None else
np.column_stack((result_array, reflectance_column)))
np.savetxt('outputfile.txt', result_array)