2016-11-07 11 views
0

Нижеприведенный код должен проходить через каталоги, открывать файлы, конвертировать и т. Д. Дело в том, что ячейка пуста, результирующий файл CSV выводит «None» на свое место.Python: Openpyxl выдает «None» для пустых ячеек

Любая причина, почему и может ли это быть устранено?

Благодаря

import os 
from openpyxl import load_workbook 
import csv 

for subdir, dirs, files in os.walk("C:\Users\Alan\Downloads\Knowledge\HOW DO I"): 
    for file in files: 
     filepath = subdir + os.sep + file 

     wb = load_workbook(filename=filepath) 
     sh = wb.active 
     your_csv_file = open(filepath.replace(".xlsx","")+'_csv.csv','wb') 
     wr = csv.writer(your_csv_file,quoting=csv.QUOTE_ALL) 

     for rownum in sh.iter_rows(): 
      wr.writerow([unicode(val.value).encode('ascii','ignore') for val in rownum]) 

     your_csv_file.close() 
+0

Fix: использовать два раза подряд в пути с Windows: 'os.walk (" C : \\ Пользователи \\ Алан \\ Загрузки \\ Знания \\ КАК Я Я ")'. –

+0

Он отлично работает с одним – pee2pee

ответ

1

OpenPyXl не хранит пустые клетки (пустые средства без значения, шрифта, границ, и так далее). Если вы получаете ячейку на листе, она динамически создает новую пустую ячейку с значением None.

Текущая реализация (V2.4.0) от Worksheet.iter_rows() использования Worksheet.cell() метода, который вызывает Cell() конструктор без значения.

Вы должны изменить свой код для обработки «пустые» ячейки:

for rownum in sh.iter_rows(): 
    values = [(u"" if cell.value is None else unicode(cell.value)) 
       for cell in rownum] 
    wr.writerow([value.encode('ascii', 'ignore') for value in rownum]) 

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

+0

Спасибо - пришлось немного изменить, но теперь он работает – pee2pee

-1

Почему? Потому что кажется правильным приравнивать «пусто» к «None». Я хочу, чтобы 'NA', хотя, так что у меня есть что-то вроде:

def _transmap(dat): 
    transmap = { 
     # empty cells are going to be empty strings 
     None: 'NA', 
     # workaround for bug in openpyxl 
     # https://bitbucket.org/openpyxl/openpyxl/issues/674/ 
     dt.datetime(1899, 12, 30, 0, 0): dt.time(0, 0), 
     dt.datetime(1899, 12, 31, 0, 0): dt.datetime(1900, 1, 1, 0, 0), 
    } 
    return transmap[dat] if dat in transmap else dat 

, а затем вы WITE что-то вроде:

for rownum in sh.iter_rows(): 
      wr.writerow([unicode(_transmap(val.value)).encode('ascii','ignore') for val in rownum]) 
+0

Потому что пустой должен означать пустой/нуль – pee2pee

+0

Вопрос о вкусе. В моем поле пустая строка имеет другое значение, чем «нет данных», которое закодировано как пустая ячейка. Что-то не так с моим ответом? – hvwaldow

Смежные вопросы