Создать excel-совместимый CSV-файл с python?

Я пытаюсь создать 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

[р-р-р, спасибо в Excel. Серьезно, в чем смысл цитат?]

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

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

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

6 ответов


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

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

9-1,9-2,9-3

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

Edit: файл csv, содержащий:

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

читает в электронную таблицу как:

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

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


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


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

import csv

RESULTS = [
    ['val_col1;','val_col2;','val_col3']
]
resultFile = open("testExcel.csv",'wb')
resultWriter= csv.writer(resultFile, dialect='excel-tab')
resultWriter.writerows(RESULTS)

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

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

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

Update: удален спам пустых ячеек с большим количеством =""


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')

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

dialect=csv.excel

а в

import csv
csv.excel 
  • линетерминатор '\r\n'
  • skipinitialspace False
  • цитировать 0
  • разделитель ','
  • quotechar '"'
  • doublequote True

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