Python:如何从多块csv表加载列?

Python:如何从多块csv表加载列?,python,csv,numpy,block,Python,Csv,Numpy,Block,我现在正在为SIP数据开发一个fit程序。不幸的是,数据位于具有以下结构的csv表中: f; Abs(Zm); Std(Abs); Phi(Zm); Std(Phi); Re(Zm); Im(Zm); Time [s] 1.0000000e-001; 7712.6262; 0.0247; -0.003774; 0.000001; 7712.5713; -29.1074;

我现在正在为SIP数据开发一个fit程序。不幸的是,数据位于具有以下结构的csv表中:

       f;      Abs(Zm);     Std(Abs);      Phi(Zm);     Std(Phi);       Re(Zm);       Im(Zm);     Time [s]
1.0000000e-001;    7712.6262;       0.0247;    -0.003774;     0.000001;    7712.5713;     -29.1074;   3418623040
2.0000000e-001;    7712.4351;       0.0030;    -0.007543;     0.000001;    7712.2157;     -58.1732;   3418623056
5.0000000e-001;    7710.8455;       0.0094;    -0.018837;     0.000002;    7709.4775;    -145.2434;   3418623063
1.0000000e+000;    7705.3763;       0.0098;    -0.037637;     0.000000;    7699.9195;    -289.9395;   3418623067
2.0000000e+000;    7683.8120;       0.0241;    -0.075058;     0.000001;    7662.1778;    -576.1935;   3418623069
5.0000000e+000;    7539.7945;       0.0080;    -0.184724;     0.000002;    7411.5201;   -1384.8720;   3418623071
1.0000000e+001;    7088.6894;       0.0060;    -0.351521;     0.000001;    6655.2169;   -2440.8206;   3418623072


         f;     Abs(Z12);     Phi(Z12);     Abs(Z34);     Phi(Z34);     Abs(Z14);     Phi(Z14);     Time [s]
1.0000000e-001;       1.7821;     3.139014;       0.2545;    -3.141592;    7710.5896;    -0.003774;   3418623040
2.0000000e-001;       1.7850;     3.133381;       0.2572;    -3.126220;    7710.3930;    -0.007543;   3418623056
5.0000000e-001;       1.7755;     3.121223;       0.2514;    -3.133763;    7708.8186;    -0.018838;   3418623063
1.0000000e+000;       1.7683;     3.100815;       0.2503;     3.139466;    7703.3580;    -0.037638;   3418623067
2.0000000e+000;       1.8091;     3.058834;       0.2538;    -3.123705;    7681.7502;    -0.075060;   3418623069
5.0000000e+000;       1.5547;     2.943611;       0.2398;    -3.136317;    7538.0045;    -0.184727;   3418623071
我使用numpy.loadtxt()例程从表中收集数据,如下所示:

def load_datafile(filename):
try:
     x_data, y_data = numpy.loadtxt(filename , unpack=True, usecols=(0,1),) 
except IOError:
    print('There was an error opening the file: {0}'.format(filename))
    x_data=[]
    y_data=[]
return x_data, y_data
我知道在loadtxt()命令中使用表中的特定块没有进一步的标识符。但是有没有一个方便的解决办法

否则,是否有一个简单的脚本可以将csv输入文件重新排列为单个块列

提前谢谢! 问候,
Gunnar

假设与输入一样,总是有一对空换行符,这个小脚本应该返回一组文件对象:

def parseMultiblockCSV(filename):
    original = open(filename, "r")
    newlines = 0
    block = 0
    current = open(filename + "." + str(block), "w")
    for line in original:
        if line == "":
            newlines += 1
        if newlines >= 2:
            current.close()
            block += 1
            current = open(filename + "." + str(block), "w")
        current.write(line)
    current.close()
    files = []
    for n in range(block + 1):
        files.append(open(filename + "." + str(n)))
    return files
如果您需要在同一个表中同时使用这两个文件,我假设它有一个功能,可以将多个文件加载到一个表中。否则:

def combineCSVFiles(files, output):
    if len(files) == 1:
        return files[0]
    start = file[0]
    files = file[1:]
    out = open(output, "w")
    for line in start:
        out.write(line)
    for input in files:
        first = false
        for line in input:
        if not first:
            first = true
            continue
        out.write(line)
    out.close()
    return open(output, "r")

这将返回一个包含给定文件对象的连接内容的文件对象,忽略除第一个文件以外的任何内容的第一个标题行。

您可以先将输入数据拆分为块,然后使用loadtxt或genfromtxt(我更喜欢这个,因为它有读取标题的选项)


你能澄清一下“块”是什么意思吗?你的示例数据在每个块中有不同的列,每个块的块大小也不同(第一个是7行,第二个是6行)。这是真的吗?你需要从每个块和每个列中读取数据吗?我认为每个块的列是不同的,所以你的答案不能处理这个问题。还是我错过了什么?谢谢你的genfromtxt()创意。在我的csv表格中操作换行符样式后,效果非常好。如果您想在换行符样式方面有更多的灵活性,还可以基于正则表达式进行拆分:
re.split
from numpy import genfromtxt
from StringIO import StringIO

def read_by_block(filename):
    blocks = []
    data = open(filename).read()
    for blk in data.split('\n\n'): # we assume that blocks are separated by two newlines
        blocks.append(genfromtxt(StringIO(blk), delimiter=';', names=True))
    return blocks

data = read_by_block('data.txt')

print data[0].dtype.names # print fields for first block
print data[0]['StdPhi'] # print column 'Std(Phi)' in 1st block