Создать Excel-совместимый файл CSV с Python? - PullRequest
9 голосов
/ 14 ноября 2011

Я пытаюсь создать CSV-файл с использованием Python, который действительно совместим с Excel (я использую Excel 2007, если это имеет какое-то значение).

Вот что я пытаюсь сделать

import csv

data = [ ['9-1', '9-2', '9-3'] ]

fd = open('test.csv', 'wb')
try:
    writer = csv.writer(fd, dialect='excel', quotechar='"', quoting=csv.QUOTE_ALL)
    writer.writerows(data)

finally:
    fd.close()

Это создает CSV-файл, который содержит:

"9-1","9-2","9-3"

Когда я загружаю его в Excel, я получаю столбцы:

09-Jan  09-Feb  09-Mar

[Grrr, спасибо Excel. Серьезно, какой смысл в кавычках?]

Теперь я прочитал в другом месте , что для того, чтобы Excel мог обрабатывать строки как литералы, они должны начинаться со знака равенства ="Like This". Так что я действительно хочу произвести:

="9-1",="9-2",="9-3"

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

Ответы [ 6 ]

7 голосов
/ 14 ноября 2011

FWIW, Excel 2007 даже не совместим с самим собой. Если вы введете 9-1 в пустую электронную таблицу, она преобразуется в 1 сентября, как только вы покинете ячейку. Если вы измените формат ячейки с общего на текстовый, вы можете ввести строковые литералы без изменений и сохранить их как файл .csv, но при чтении этого файла в пустую электронную таблицу (с общим форматом) он будет преобразован в даты.

Excel сохраняет файл как

9-1,9-2,9-3

без кавычек и без знаков "=". Даже установка форматов ячеек на текст до чтения файла csv не работает для меня - он импортирует как даты (отображаемое значение 1 сентября, значение ячейки 01.09.2011) с 3 ячейками в пользовательском формате; остальные ячейки преобразуются в общие.

Редактировать: CSV-файл, содержащий:

"9-1",'9-2',='9-3',=''9-4''

читается в таблице как:

1-Sep  '9-2'  ='9-3'  ="9-4"

Таким образом, = не приносит никакой пользы, но по крайней мере одинарные кавычки получат строковый литерал с сохранением кавычек. Кто-то более знающий в Excel должен будет помочь избавиться от кавычек; «Вставить значения» не удаляет их.

4 голосов
/ 14 ноября 2011

Проблема заключается в том, что вы импортируете свой CSV-файл в Excel с помощью средства импорта CSV-файлов Excel. Я знаю, что это нелогично, но вы не должны импортировать CSV-файлы таким образом. Вместо этого импортируйте их как текстовые файлы (то есть имя с расширением txt). Затем у вас будет возможность указать тип каждого столбца и правильно выбрать текст для столбцов, похожих на даты в Excel.

Если вы ищете подход «вот файл, который вы можете открыть в Excel», попробуйте xlwt (не моя первоначальная рекомендация pyXLWriter ) и полностью избегайте CSV.

3 голосов
/ 28 мая 2016

Если ваша цель - просто написать список в виде таблицы в Excel.Вы можете попробовать ниже образец, где ";"и свойство dialect = 'excel-tab' позволяет нам переключаться между столбцами.

import csv

RESULTS = [
    ['val_col1;','val_col2;','val_col3']
]
resultFile = open("testExcel.csv",'wb')
resultWriter= csv.writer(resultFile, dialect='excel-tab')
resultWriter.writerows(RESULTS)
1 голос
/ 14 ноября 2011

Хорошо, спасибо за вашу помощь, я нашел грубое решение, поэтому я решил поделиться им здесь.

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

import csv
import re

data = [ ['9-1', '9-2', '9-3'] ]


def quoteCsvData(data):
    for x, row in enumerate(data):
        for y, item in enumerate(row):
             if data[x][y] != '':
                 data[x][y] = r'="' + data[x][y] + r'"'
    return data

def unquoteCsvData(data):
    for x, row in enumerate(data):
        for y, item in enumerate(row):
            if data[x][y] != '':
                m = re.match(r'="([^"]*)"',data[x][y])
                if m:
                    data[x][y] =  m.group(1)
    return data


fd = open('test2.csv', 'wb')
data = quoteCsvData(data)
try:
    writer = csv.writer(fd, delimiter=',',
                            quotechar='|', 
                            quoting=csv.QUOTE_NONE, 
                            escapechar='\\')
    writer.writerows(data)

finally:
    fd.close()

fd = open('test2.csv', 'rb')
try:
    reader = csv.reader(fd, delimiter=',', 
                            quotechar='|', 
                            quoting=csv.QUOTE_NONE, 
                            escapechar='\\')
    data = []
    for row in reader:
        data.append(row)

finally:
    fd.close()

data = unquoteCsvData(data)

print data

Обновление: убран спам пустых ячеек с лотами =""

0 голосов
/ 14 ноября 2011
data = [ ['9-1', '9-2', '9-3'] ]
fd = open('test.csv', 'wb')
for row in data:
    for x in row:
        fd.write('="{}",'.format(x))
    fd.write('\n')
0 голосов
/ 14 ноября 2011

попробовать ::

dialect=csv.excel

как в

import csv
csv.excel 
  • переводчик строки '\ r \ n'
  • skipinitialspace False
  • цитирование 0
  • разделитель ','
  • quotechar '"'
  • двойная кавычка True

Для меня это немного чёрного искусства, которое никогда не беспокоило меня настолько, чтобы читать код, но небольшие эксперименты, которые я проводил, всегда приводили к превосходству (2003), чтобы вести себя достаточно хорошо с вышеуказанными форматами.

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