2013-05-31 3 views
2

Я пытаюсь объединить коллекцию из 600 текстовых файлов, каждая строка выглядитОбъединение файлов в Python с использованием

Measurement title Measurement #1

ebv-miR-BART1-3p 4.60618701
....
evb-miR-BART1-200 12.8327289

с 250 или так строк в каждом файле. Каждый файл отформатирован таким образом, с теми же заголовками данных. То, что я хотел бы сделать, это объединить файлы таким образом, что он выглядит как этот

Measurement title Measurement #1 Measurement #2

ebv-miR-BART1-3p 4.60618701 4.110878867
....
evb-miR-BART1-200 12.8327289 6.813287556

Я интересно, если есть простой способ python, чтобы вырезать второй столбец каждого файла, а затем добавить его в главный файл? Я планировал вытащить каждую строку, а затем использовал регулярные выражения для поиска второго столбца и добавления его в соответствующую строку в основном файле. Есть ли что-то более эффективное?

+0

Под «с теми же заголовками данных», вы имеете в виду, что все они говорят «Измерение №1» или что все они говорят «Измерение № [все]»? Являются ли файлы названными в предсказуемом порядке? – DSM

+0

Я вытащил список файлов, который я хочу, используя glob, затем прочитал данные из файлов. – Adarath

ответ

3

Это небольшой объем данных для настольных компьютеров сегодняшнего дня (около 150000 измерений) - так что хранить все в памяти, а сброс в один файл будет проще, чем другая стратегия. Если бы это не поместилось в ОЗУ, возможно, использование SQL было бы неплохим подходом - , но как бы то ни было, вы можете создать единственный словарь по умолчанию, в котором каждый элемент представляет собой список - , чтобы прочитать все ваши файлы и собрать измерения для этого словарь и сбрасывать его на диск -

# create default list dictionary: 
>>> from collections import defaultdict 
>>> data = defaultdict(list) 
# Read your data into it: 
>>> from glob import glob 
>>> import csv 
>>> for filename in glob("my_directory/*csv"): 
... reader = csv.reader(open(filename)) 
... # throw away header row: 
... reader.readrow() 
... for name, value in reader: 
...  data[name].append(value) 
... 
>>> # and record everything down in another file: 
... 
>>> mydata = open("mydata.csv", "wt") 
>>> writer = csv.writer(mydata) 
>>> for name, values in sorted(data.items()): 
... writer.writerow([name] + values) 
... 
>>> mydata.close() 
>>> 
+0

. Лиза попыталась предложить через редактирование, используя формы csv.reader() и csv.writer(), которые позволяют указать если соответствующий разделитель представляет собой пробел, а не запятую по умолчанию. –

0

Используйте модуль csv для чтения файлов, создайте словарь имен измерений и внесите значения в словаре список значений из файла.

0

У меня пока нет комментариев, поэтому отдельный ответ.

Ответ jsbueno работает очень хорошо, пока вы уверены, что одинаковые идентификаторы измерений встречаются в каждом файле (порядок не важен, но наборы должны быть равны!).

В следующей ситуации:

file1: 
measID,meas1 
a,1 
b,2 

file2: 
measID,meas1 
a,3 
b,4 
c,5 

вы получите:

outfile: 
measID,meas1,meas2 
a,1,3 
b,2,4 
c,5 

вместо желаемого:

outfile: 
measID,meas1,meas2 
a,1,3 
b,2,4 
c,,5  # measurement c was missing in file1! 

Я использую запятые вместо пробелов в качестве разделителей для лучшая видимость.

Смежные вопросы