Python – конвертировать файл с разделителями табуляции в csv определенным образом

У меня есть текстовый файл с разделителями табуляции, в каждой записи которого есть 10 столбцов следующим образом:

p001    64      20141209      meals (attendees)    ML   ENTER   Entertainment   xyz Restaurants      6.0     "_e' Restaurants (123) 456-7890 \r\n          FORUM \r\n     ,Around \r\n\r\n':33 113-2 \r\n\r\n 8440 XYZ09'15       1:11PM \r\n\r\n   1 Burger          6.00 \r\n\r\n    SSIONS      6.00 \r\n    TOTAL PAID    6 .00 \r\n    XXXXXXXXXXX2012 XX/XX \r\n    XYZ EXPRESS
6.00 \r\n\r\n\r\n  7,-10( YOU! FOR DINING WITH US! \r\n\r\n         113-2 \r\n\r\nYour r is: 840     \r\n"

P.S. В последнем столбце текст заключен в "". И мой 1-й столбец НЕ уникален.

Я хотел бы преобразовать этот текстовый файл в файл csv, чтобы я выбирал данные только из 1-го, 2-го, 8-го, 9-го и 10-го столбцов записи. Кроме того, все данные должны быть заключены в «».

Например, приведенная выше запись должна быть преобразована в следующую строку выходного CSV-файла:

"p001","64","xyz Restaurants","6.0","_e' Restaurants (123) 456-7890 \r\n          FORUM \r\n     ,Around \r\n\r\n':33 113-2 \r\n\r\n 8440 XYZ09'15       1:11PM \r\n\r\n   1 Burger          6.00 \r\n\r\n    SSIONS      6.00 \r\n    TOTAL PAID    6 .00 \r\n    XXXXXXXXXXX2012 XX/XX \r\n    XYZ EXPRESS
    6.00 \r\n\r\n\r\n  7,-10( YOU! FOR DINING WITH US! \r\n\r\n         113-2 \r\n\r\nYour r is: 840     \r\n"

person activelearner    schedule 29.04.2015    source источник
comment


Ответы (1)


Это должно сработать для вас. Обратите внимание, что здесь используется библиотека csv как для ввода, так и для вывода, мы просто меняем разделитель текста. CSV должен автоматически экранировать символы кавычек при записи файла.

import csv
try:
    with open(r'input.tsv', 'r', newline='\n') as in_f, \
         open(r'output.csv', 'w', newline='\n') as out_f:
        reader = csv.reader(in_f, delimiter='\t')
        writer = csv.writer(out_f, delimiter=',', quoting=csv.QUOTE_ALL)  # Quoting added per comment from @Rob.
        for li in reader:
            try:
                writer.writerow([li[0], li[1], li[2], li[7], li[8], li[9],])
            except IndexError:  # Prevent errors on blank lines.
                pass
except IOError as err:
    print(err)

Мне не удалось разобрать, где должны быть вкладки в ваших примерах данных (в отличие от пробелов), но я протестировал их со следующими данными для input.tsv:

1   2   3   4   5   6   7   8   9   10
11  12  13  14  15  16  17  18  19  20
21  22  23  24  25  26  27  28  29  30

Будет генерировать следующие результаты в output.csv:

"1","2","3","8","9","10"
"11","12","13","18","19","20"
"21","22","23","28","29","30"

Обновлять

Обратите внимание, что обновление в коде для добавления quoting=csv.QUOTE_ALL было сделано в соответствии с предложением в комментариях Роба. Спасибо за улов!

person Doug R.    schedule 29.04.2015
comment
Я думаю, вы пропустили « все данные должны быть заключены в ». Попробуйте csv.writer(out_f, delimiter=',', quoting=csv.QUOTE_ALL). - person Robᵩ; 29.04.2015