2012-04-23 6 views
0

У меня есть 125 файлов данных, содержащих два столбца и 21 строку данных, и я хотел бы импортировать их в один файл .csv (в виде 125 пар столбцов и всего 21 строки). Это то, что мои файлы данные выглядят следующим образом:Python - импорт нескольких файлов в один .csv-файл

enter image description here

Я довольно новый для Python, но я придумал следующий код:

import glob 
Results = glob.glob('./*.data') 
fout='c:/Results/res.csv' 
fout=open ("res.csv", 'w') 
for file in Results: 
g = open(file, "r") 
fout.write(g.read()) 
g.close() 
fout.close() 

Проблема с приведенным выше кодом является то, что все данные копируются только в два столбца с 125 * 21 строками.

Любая помощь очень ценится!

+2

Это полностью работа для 'paste'. –

+1

есть ли команда вставки в python? – Esan

+0

Существует Python Paste, но это не то, о чем я говорю. –

ответ

1

Это должно работать:

import glob 

files = [open(f) for f in glob.glob('./*.data')] #Make list of open files 
fout = open("res.csv", 'w') 

for row in range(21): 
    for f in files: 
     fout.write(f.readline().strip()) # strip removes trailing newline 
     fout.write(',') 
    fout.write('\n') 

fout.close() 

Обратите внимание, что этот метод, вероятно, потерпеть неудачу, если вы пытаетесь большое количество файлов, я считаю, предел по умолчанию в Python 256.

+0

Извините, забыли включить запятую между конкатенированными линиями. Должен надеяться, теперь будет хорошо – SudoNhim

+0

Благодарим за код, но есть небольшая проблема с форматированием, так как есть только 125 столбцов (т. Е. Пара столбцов соединена вместе при открытии в excel) – Esan

+0

Извините, я исправил эту ошибку около 1 через минуту после того, как я разместил его. Попробуйте повторно скопировать его, если вы еще не исправили его :) – SudoNhim

1

Вы можете попробовать модуль CSV python (http://docs.python.org/library/csv.html), который предоставляет очень полезные методы для чтения и записи CSV-файлов. Поскольку вы заявили, что хотите только 21 строку с 250 столбцами данных, я бы предложил создать 21 список python в качестве ваших строк, а затем добавить данные в каждую строку при прохождении через ваши файлы.

что-то вроде:

import csv 

rows = [] 
for i in range(0,21): 
    row = [] 
    rows.append(row) 

#not sure the structure of your input files or how they are delimited, but for each one, as you have it open and iterate through the rows, you would want to append the values in each row to the end of the corresponding list contained within the rows list. 

#then, write each row to the new csv: 

writer = csv.writer(open('output.csv', 'wb'), delimiter=',') 
for row in rows: 
    writer.writerow(row) 
+0

Спасибо за это. Пожалуйста, см. Рис., Который я сейчас включил в вопрос. – Esan

1

(К сожалению, я не могу комментировать, пока.)

[Отредактировано позже, следующее утверждение неверно !!!]«davesnitty-х порождающая цикл строк может быть заменен на rows = [[]] * 21. " Это неправильно, потому что это создало бы список пустых списков, но пустые списки были бы единственным пустым списком, общим для всех элементов внешнего списка.

My +1 к использованию стандартного модуля csv. Но файл должен быть всегда закрыт, особенно когда вы открываете большую часть файлов. Кроме того, есть ошибка. Строка, считанная из файла через - хотя вы здесь только записываете результат. Решение фактически отсутствует. В принципе, строка, считанная из файла, должна быть добавлена ​​к подсписку, связанному с номером строки. Номер строки должен быть получен через enumerate (reader), где читатель - csv.reader (fin, ...).

[добавлено позже] Попробуйте следующий код, исправьте пути для вашего puprose:

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) 
Смежные вопросы