Как разделить файл CSV точкой с запятой? - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь открыть файл CSV после того, как создаю его с помощью python. Моя цель - иметь возможность прочитать файл обратно без редактирования, и моя проблема в том, что я не могу заставить работать разделитель. Мой файл создается с помощью Python CSV Writer, а затем я пытаюсь использовать ридер для чтения данных из файла. Вот где я застреваю. Мой CSV-файл сохраняется в том же месте, где и моя программа на Python, поэтому я знаю, что это не проблема доступа. Мой файл создан с использованием специального разделителя символов. Я использую точки с запятой ;, поскольку необработанные данные уже содержат запятые ,, двоеточия ;, знаки плюс +, амперсанды &, точки . и, возможно, подчеркивание _ и / или тире -. Это код, который я использую для чтения моего CSV-файла:

with open('Cool.csv') as csv_file:
  csv_reader = csv.reader(csv_file, delimiter=';', dialect=csv.excel_tab)
  for row in csv_reader:
    print row[0]

csv_file.close() 

Теперь это мой CSV-файл (Cool.csv):

"Sat, 20 Apr 2019 00:17:05 +0000;Need to go to store;Eggs & Milk are needed ;Store: Grocery;Full Name: Safeway;Email: safewayiscool@gmail.com;Safeway <safewayiscool@gmail.com>, ;"
"Tue, 5 Mar 2019 05:54:24 +0000;Need to buy ham;Green eggs and Ham are needed for dinner ;Username: Dr.Seuss;Full Name: Theodor Seuss Geisel;Email: greeneggs+ham@seuss.com;"

Таким образом, я ожидаю, что мой вывод будет следующим при запуске кода:

Sat, 20 Apr 2019 00:17:05 +0000
Tue, 5 Mar 2019 05:54:24 +0000

Я либо получаю нулевую ошибку, либо она выведет всю строку. Как я могу получить его для разделения данных на то, что я хочу, чтобы определить столбцы, разделенные ;?

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

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

UPDATE: Вот код, который создает файл:

with open('Cool.csv', 'w') as csvFile:
    writer = csv.writer(csvFile, delimiter=';')
    for m in file: 
        message = m['msg']
        message2 = message.replace('\r\n\r\n', ';')
        message3 = message2.replace('\r\n', ';')
        entry = m['date'] + ";" + m['subject'] + ";" + message3
        list = []
        list.append(entry)
        writer.writerow(list)
csvFile.close()

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Похоже, файл создан неправильно.Приведенные примеры данных показывают всю строку в двойных кавычках, которая обрабатывает ее как один длинный столбец.Вот правильный код для записи и чтения и разделенный точкой с запятой файл:

import csv

with open('Cool.csv','w',newline='',encoding='utf-8-sig') as csv_file:
    csv_writer = csv.writer(csv_file,delimiter=';')
    csv_writer.writerow(['data,data','data;data','data+-":_'])

with open('Cool.csv','r',newline='',encoding='utf-8-sig') as csv_file:
    csv_reader = csv.reader(csv_file,delimiter=';')
    for row in csv_reader:
        print(row)

Вывод (соответствует записанным данным):

['data,data', 'data;data', 'data+-":_']

Cool.csv:

data,data;"data;data";"data+-"":_"

Примечания:

  • utf-8-sig - наиболее совместимая кодировка с Excel.Любой символ Unicode, который вы вставите в файл, будет работать и будет выглядеть правильно, когда CSV будет открыт в Excel.
  • newline='' требуется для документации CSV.Модуль csv обрабатывает свои собственные символы новой строки в соответствии с используемым диалектом (по умолчанию 'excel').
  • ; разделитель не требуется.По умолчанию , будет работать.Обратите внимание, что вторая запись имеет точку с запятой, поэтому поле было заключено в кавычки.Первое поле с запятой вместо этого было бы заключено в кавычки, если бы разделитель был запятой, и он все еще работал бы.
  • csv_writer.writerow принимает последовательность, содержащую данные столбца.
  • csv_reader возвращает каждоестрока как list данных столбца.
  • Столбец в .CSV заключается в двойные кавычки, если он содержит разделитель, и кавычки удваиваются, если они присутствуют в данных, чтобы избежать их.Обратите внимание, что третье поле содержит двойные кавычки.
  • csv_writer.close() и csv_reader.close() не нужны при использовании with.
0 голосов
/ 01 мая 2019

RTFM.

С help (csv)

    DIALECT REGISTRATION:

    Readers and writers support a dialect argument, which is a convenient
    handle on a group of settings.  When the dialect argument is a string,
    it identifies one of the dialects previously registered with the module.
    If it is a class or instance, the attributes of the argument are used as
    the settings for the reader or writer:

        class excel:
            delimiter = ','
            quotechar = '"'
            escapechar = None
            doublequote = True
            skipinitialspace = False
            lineterminator = '\r\n'
            quoting = QUOTE_MINIMAL

И вы используете dialect=csv.excel_tab.

Вы фактически перезаписываете свой разделитель.Только не используйте опцию диалекта.

Sidenote : with обрабатывает закрытие дескриптора файла для вас.Прочитайте здесь

Второй sidenote : вся строка вашего CSV-файла заключена в двойные кавычки .Либо избавьтесь от них, либо отключите цитирование.то есть

with open('b.txt') as csv_file:
  csv_reader = csv.reader(csv_file, delimiter=';', quoting=csv.QUOTE_NONE)
  for row in csv_reader:
    print (row[0])
...