Создать 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), чтобы вести себя достаточно хорошо с вышеуказанными форматами.