5

我有 125 个数据文件,其中包含两列和 21 行数据。请看下图:

在此处输入图像描述

我想将它们导入单个 .csv 文件(作为 250 列和 21 行)。

我对python相当陌生,但这是我被告知的,代码明智的:

import glob
Results = [open(f) for f in glob.glob("*.data")] 
fout = open("res.csv", 'w')

for row in range(21):
 for f in Results:
  fout.write( f.readline().strip() ) 
  fout.write(',')
 fout.write('\n')
fout.close()

但是,代码有一点问题,因为我只得到了 125 列,(即力和位移列写在一列中)请参考下图: 在此处输入图像描述

在此处输入图像描述

如果有人能帮我解决这个问题,我将不胜感激!

4

4 回答 4

8
import glob
results = [open(f) for f in glob.glob("*.data")]
sep = ","
# Uncomment if your Excel formats decimal numbers like 3,14 instead of 3.14
# sep = ";"

with open("res.csv", 'w') as fout:
    for row in range(21):
        iterator = (f.readline().strip().replace("\t", sep) for f in results)
        line = sep.join(iterator)
        fout.write("{0}\n".format(line))

因此,为了解释您的代码出了什么问题,您的源文件使用制表符作为字段分隔符,但您的代码使用逗号分隔从这些文件中读取的行。如果您的 Excel 使用句点作为小数分隔符,则它使用逗号作为默认字段分隔符。除非用引号括起来,否则空格将被忽略,并且您会看到结果。

如果您使用 Excel 的文本导入功能(数据功能区 => 从文本),您可以要求它将逗号制表符视为有效的字段分隔符,然后我很确定您的原始输出也可以工作。

相比之下,上面的代码应该会生成一个双击时可以正确打开的文件。

于 2012-04-23T13:06:50.633 回答
2

您不需要编写自己的程序来执行此操作,使用 python 或其他方式。您可以使用现有的 unix 命令(如果您在该环境中):

paste *.data > res.csv
于 2012-04-23T14:11:05.027 回答
1

尝试这个:

import glob, csv
from itertools import cycle, islice, count

def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    pending = len(iterables)
    nexts = cycle(iter(it).next for it in iterables)
    while pending:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            pending -= 1
            nexts = cycle(islice(nexts, pending))

Results = [open(f).readlines() for f in glob.glob("*.data")] 
fout = csv.writer(open("res.csv", 'wb'), dialect="excel")

row = []
for line, c in zip(roundrobin(Results), cycle(range(len(Results)))):
    splitline = line.split()
    for item,currItem in zip(splitline, count(1)):
        row[c+currItem] = item
    if count == len(Results):
        fout.writerow(row)
        row = []
del fout

它应该遍历输入文件的每一行并将它们拼接成一行,csv 库将以列出的方言写入。

于 2012-04-23T14:11:14.523 回答
1

我建议习惯 csv 模块。原因是如果数据不是那么简单(标题中的简单字符串,然后只有数字),则很难再次实现所有内容。尝试以下操作:

import csv
import glob
import os

datapath = './data'
resultpath = './result'
if not os.path.isdir(resultpath):
   os.makedirs(resultpath)

# Initialize the empty rows. It does not check how many rows are
# in the file.
rows = []

# Read data from the files to the above matrix.
for fname in glob.glob(os.path.join(datapath, '*.data')):
    with open(fname, 'rb') as f:
        reader = csv.reader(f)
        for n, row in enumerate(reader):
            if len(rows) < n+1:
                rows.append([])  # add another row
            rows[n].extend(row)  # append the elements from the file

# Write the data from memory to the result file.
fname = os.path.join(resultpath, 'result.csv')
with open(fname, 'wb') as f:
    writer = csv.writer(f)
    for row in rows:
        writer.writerow(row)

打开文件的with构造可以由以下一对替换:

f = open(fname, 'wb')
...
f.close()

csv.reader 和 csv.writer 只是解析或组成文件行的包装器。文档说他们需要以二进制模式打开文件。

于 2012-04-23T15:37:19.067 回答