Чтение файла CSV и запись результата функции в другой

Ну, вы можете использовать регулярные выражения. Что-то вроде /http:\/\/([^\.]+)/, то есть первая группа non '.' письма после http. Проверьте http://rubular.com/ , вы можете проверить свои регулярные выражения на основе набора тестов, это отлично подходит для изучения этого инструмента:)

0
задан Essex 17 January 2019 в 11:48
поделиться

2 ответа

Основная проблема в том, что вам нужно передать writer.writerow() последовательность элементов, а не строку. Чтобы получить требуемые разделители, необходимо указать delimiter=";" при создании объектов csv.writer, а также объектов csv.reader. Было несколько других проблем, например, как вы open() сохраняли CSV-файлы, всегда нужно указывать newline='', чтобы убедиться, что переводы строк обрабатываются правильно.

Я также добавил строку, чтобы скопировать строку заголовка в выходной файл. В любом случае, это то, что output.csv содержит после запуска:

id, email, first_name, last_name, institution, creation_date, modification_date, country
1;tar.ber@test.eu;tar;ber;EDTG,TGD;;;
2;val.dzz@test.eu;var;dzz;Test with , inside;;;

А вот ваш код с изменениями:

import csv

with open('customer.csv', 'r', newline='') as csvFile, \
     open("output.csv", 'w', newline='') as outFile:
        reader = csv.reader(csvFile, delimiter=";")
        writer = csv.writer(outFile, delimiter=";")

        writer.writerow(next(reader))  # Copy header row.
        for row in reader:
            id, email, first_name, last_name, institution = row[0:5]
            modification_date, country, creation_date = row[5:8]
            writer.writerow([id, email, first_name, last_name, institution,
                             modification_date, country, creation_date])
0
ответ дан martineau 17 January 2019 в 11:48
поделиться

Вместо создания строки для передачи в writer.writerow вы должны создать список строк.

        writer.writerow([id, email, first_name, last_name, institution, modification_date, country, creation_date])

Обратите внимание, что эта строка уже то, что вы хотите, так что вы можете упростить это до

import csv
import re

with open('customer.csv', 'r') as csvFile:
    reader = csv.reader(csvFile, delimiter=";")
    writer = csv.writer(open("output.csv", 'w'), delimiter=";", quoting=QUOTE_NONNUMERIC)
    for row in reader:
        writer.writerow(row)

Кроме того, вы также должны добавить правильный разделитель для писателя.

Наконец, я думаю, что модуль CSV будет правильно обрабатывать цитирование. То есть, если в данных используется разделитель ',' он будет заключать в кавычки ',' в противном случае это не так. Таким образом, в соответствии со спецификацией CSV, добавлять кавычки вокруг учреждения с символом «,» было бы неправильно.

Если вам все же нужны кавычки, вы можете использовать аргумент ключевого слова quoting библиотеки csv. Это те константы, которые он поддерживает. https://docs.python.org/2/library/csv.html#csv.QUOTE_ALL . К сожалению, он не поддерживает цитирование только тех полей, которые вы хотите (если вы не измените разделитель на ','), но вы можете заключить в кавычки все поля или все нечисловые поля.

Чтобы объяснить поведение, которое вы видите: похоже, что writerow будет перебирать все, что ему дано, и, таким образом, перебирало строку, которую вы построили, и интерпретировало каждый символ как одно поле, добавляя, таким образом, «,» между каждым.

0
ответ дан bimmlerd 17 January 2019 в 11:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: