Как заменить столбец в файле CSV в Python? - PullRequest
5 голосов
/ 21 июля 2009

У меня есть 2 CSV-файла. Мне нужно заменить столбец в одном файле на столбец из другого файла, но они должны оставаться отсортированными в соответствии с идентификатором столбца.

Вот пример:

file1:

ID, transect, 90mdist                                      
1, a, 10,                                                  
2, b, 20,                                                
3, c, 30,     

file2:

ID, transect, 90mdist                                
1, a, 50                                                   
2, b, 70                                                     
3, c, 90          

В основном я создал новый файл с правильным 90mdist, и мне нужно вставить его в старый файл, но он должен совпадать с тем же идентификатором #.

Насколько я понимаю, Python рассматривает CSV-файлы как строку. так что я могу использовать словарь или преобразовать данные в список, а затем изменить его? какой путь лучше?

Любая помощь будет принята с благодарностью!

Ответы [ 4 ]

7 голосов
/ 21 июля 2009

Модуль CSV в библиотеке Python - это то, что вам нужно здесь.

Позволяет читать и записывать CSV-файлы, обрабатывать строки, кортежи или списки элементов.

Просто прочитайте файл с исправленными значениями, сохраните его в словаре с ключом строки.

Затем прочитайте во втором файле, заменив соответствующий столбец данными из dict, и запишите в третий файл.

Готово.

2 голосов
/ 21 июля 2009

Попробуйте это:

from __future__ import with_statement

import csv

def twiddle_csv(file1, file2):
    def mess_with_record(record):
        record['90mdist'] = 2 * int(record['90mdist']) + 30
    with open(file1, "r") as fin:
        with open(file2, "w") as fout:
            fields = ['ID', 'transect', '90mdist']
            reader = csv.DictReader(fin, fieldnames=fields)
            writer = csv.DictWriter(fout, fieldnames=fields)
            fout.write(",".join(fields) + '\n')
            reader.next()   # Skip the column header
            for record in reader:
                mess_with_record(record)
                writer.writerow(record)

if __name__ == '__main__':
    twiddle_csv('file1', 'file2')

Несколько предостережений:

  • Кажется, DictReader использует первый ряд в качестве данных, даже если это соответствует поля. Вызовите reader.next (), чтобы пропустить.
  • Строки данных не могут иметь запятых. Они будут интерпретироваться как пустые столбцы.
  • DictWriter не выводит заголовки столбцов. DIY.
0 голосов
/ 21 июля 2009

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

Если два списка идентификаторов не совпадают, то простой макрос VB сделает это за вас.

0 голосов
/ 21 июля 2009

Как только у вас есть списки CSV, один простой способ заменить столбец в одной матрице на другой будет транспонировать матрицы, заменить строку, а затем транспонировать обратно отредактированную матрицу. Вот пример с вашими данными:

csv1 = [['1', 'a', '10'], ['2', 'b', '20'], ['3', 'c', '30']]
csv2 = [['1', 'a', '50'], ['2', 'b', '70'], ['3', 'c', '90']]

# transpose in Python is zip(*myData)
transposedCSV1, transposedCSV2 = zip(*csv1), zip(*csv2)
print transposedCSV1
>>> [['1', '2', '3'], ['a', 'b', 'c'], ['10', '20', '30']]

csv1 = transposedCSV1[:2] + [transposedCSV2[2]]
print csv1
>>> [['1', '2', '3'], ['a', 'b', 'c'], ['50', '70', '90']]

csv1 = zip(*csv1)
print csv1
>>> [['1', 'a', '50'], ['2', 'b', '70'], ['3', 'c', '90']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...