我有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列(即强制和置换列写在一列中)请参考下图:
如果有人能帮助我,我会非常感激!
答案 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只是解析或组成文件行的包装器。该文档说他们需要以二进制模式打开文件。