Как я могу объединить поля в строку CSV, используя Python? - PullRequest
2 голосов
/ 03 августа 2009

Я пытаюсь объединить три поля в каждой строке CSV-файла, используя Python. Это было бы просто, за исключением того, что некоторые поля заключены в двойные кавычки и содержат запятые. Вот пример:

,,Joe,Smith,New Haven,CT,"Moved from Portland, CT",,goo,

Существует ли простой алгоритм, который может объединять поля 7-9 для каждой строки в этом формате? Не все строки включают запятые в двойных кавычках.

Спасибо.

Ответы [ 4 ]

10 голосов
/ 03 августа 2009

Как то так?

import csv
source= csv.reader( open("some file","rb") )
dest= csv.writer( open("another file","wb") )
for row in source:
    result= row[:6] + [ row[6]+row[7]+row[8] ] + row[9:]
    dest.writerow( result )

Пример

>>> data=''',,Joe,Smith,New Haven,CT,"Moved from Portland, CT",,goo,
... '''.splitlines()
>>> rdr= csv.reader( data )
>>> row= rdr.next()
>>> row
['', '', 'Joe', 'Smith', 'New Haven', 'CT', 'Moved from Portland, CT', '', 'goo', '' ]
>>> row[:6] + [ row[6]+row[7]+row[8] ] +  row[9:]
['', '', 'Joe', 'Smith', 'New Haven', 'CT', 'Moved from Portland, CTgoo', '']
3 голосов
/ 04 августа 2009

Вы можете использовать модуль CSV, чтобы сделать тяжелую работу: http://docs.python.org/library/csv.html

Вы не сказали точно, как вы хотели объединить столбцы; предположительно, вы не хотите, чтобы ваше объединенное поле было «перемещено из Портленда, CTgoo». Приведенный ниже код позволяет вам указать строку-разделитель (возможно, ", ") и обрабатывать пустые / пустые поля.

[transcript of session]
prompt>type merge.py
import csv

def merge_csv_cols(infile, outfile, startcol, numcols, sep=", "):
    reader = csv.reader(open(infile, "rb"))
    writer = csv.writer(open(outfile, "wb"))
    endcol = startcol + numcols
    for row in reader:
        merged = sep.join(x for x in row[startcol:endcol] if x.strip())
        row[startcol:endcol] = [merged]
        writer.writerow(row)

if __name__ == "__main__":
    import sys
    args = sys.argv[1:6]
    args[2:4] = map(int, args[2:4])
    merge_csv_cols(*args)

prompt>type input.csv
1,2,3,4,5,6,7,8,9,a,b,c
1,2,3,4,5,6,,,,a,b,c
1,2,3,4,5,6,7,8,,a,b,c
1,2,3,4,5,6,7,,9,a,b,c

prompt>\python26\python merge.py input.csv output.csv 6 3 ", "

prompt>type output.csv
1,2,3,4,5,6,"7, 8, 9",a,b,c
1,2,3,4,5,6,,a,b,c
1,2,3,4,5,6,"7, 8",a,b,c
1,2,3,4,5,6,"7, 9",a,b,c
1 голос
/ 03 августа 2009

Вы отметили этот вопрос как «база данных». На самом деле, может быть, было бы проще загрузить эти два файла в отдельные таблицы базы данных (вы можете использовать sqllite или любую библиотеку python sql, например sqlalchemy), а затем соединить их.

Это даст вам некоторое преимущество после того, как вы сможете использовать sql-синтаксис для запросов к таблицам и можете хранить его на диске вместо хранения в памяти, так что подумайте об этом ..:)

1 голос
/ 03 августа 2009

В Python есть встроенный модуль для анализа CSV-файлов:

http://docs.python.org/library/csv.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...