Python-从多个文件中读取

时间:2012-04-23 12:54:00

标签: python file

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

enter image description here

我想将它们导入单个.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列(即强制和置换列写在一列中)请参考下图: enter image description here

enter image description here

如果有人能帮助我,我会非常感激!

4 个答案:

答案 0 :(得分: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))

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

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

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

答案 1 :(得分:2)

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

paste *.data > res.csv

答案 2 :(得分: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库将以列出的方言写入。

答案 3 :(得分: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只是解析或组成文件行的包装器。该文档说他们需要以二进制模式打开文件。