Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从多个文本文件中将具有设定行数的数据列拉入一个文本文件_Python_Matlab - Fatal编程技术网

Python 从多个文本文件中将具有设定行数的数据列拉入一个文本文件

Python 从多个文本文件中将具有设定行数的数据列拉入一个文本文件,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

我有几百个文本文件。我想提取一个特定的列,其中包含一定数量的行。这些文件完全相同,唯一不同的是数据值。我想将这些数据放入一个新的文本文件中,每个新列都位于前一列之前

该文件是一个.sed文件,与.txt文件基本相同。这就是它看起来的样子。该文件实际上来自Wvl 350-2150

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列数据
  • 'DataLines',36
    表示数据从第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)
这里

  • skip_header=35
    忽略前35行
  • usecols=4
    仅返回第5列(Python使用基于零的索引)
  • 有关更多详细信息,请参阅

在数据表中,“0,1,2”是索引,“350.0351.0”是“Chan.#”?整个数据格式,包括列名,是否总是相同的?@AlexanderCécile它看起来像一个反射光谱,
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)