Python "индекс списка вне диапазона", когда я конвертирую CSV в DOCX - PullRequest
0 голосов
/ 04 июля 2018

В моем csv есть пустые строки в каждых 17 строках (пустая строка в строке 17,34 ....) Я пытался преобразовать его в DOCX. Однако вышла ошибка «Список индексов вне диапазона». Если я удалю пустую строку в CSV, он будет работать нормально. Даже если я добавлю его вручную через Excel и функция DOCX будет работать нормально. Кажется, что table.row не может иметь дело с пустой строкой в ​​моем CSV.

    row_cells[i].text = row[i]
IndexError: list index out of range

Не могли бы вы помочь мне? Заранее спасибо.

path = os.getcwd()
##Use glob.glob to get all the "txt.csv.csv" files.
allfiles = glob.glob(path + "/*.txt.csv.csv")
df_out_filename = 'Xunjian-Report.csv'
with open(df_out_filename, 'w+', newline='') as fout:
    writer = csv.writer(fout)
    for filename in allfiles:
        with open(filename) as fin:
            reader = csv.reader(fin)
            writer.writerows(reader)
            writer.writerow("[]")  ##Insert blank row at the end

###To generate the docx
csvfile = 'Xunjian-Report.csv'
doc = docx.Document()
date = datetime.datetime.now()
with open(csvfile, newline='') as f:
    csv_reader = csv.reader(f)
    csv_headers = next(csv_reader)
    csv_cols = len(csv_headers)
    print(csv_cols)
    # Adding Subject of the document and the date
    doc.add_heading('Report', level=0)
    doc.add_heading('Date: %s/%s/%s' % (date.day, date.month, date.year), level=1)
    table = doc.add_table(rows=1, cols=csv_cols)
    table.autofix=False
    hdr_cells = table.rows[0].cells
    for i in range(csv_cols):
        hdr_cells[i].text = csv_headers[i]
    for row in csv_reader:
        row_cells = table.add_row().cells
        for i in range(csv_cols):
            row_cells[i].text = row[i]

1 Ответ

0 голосов
/ 04 июля 2018

Если в вашем списке row недостаточно элементов для row[i], вы нажимаете IndexError. Если у вас есть пустые строки на входе, они действительно будут короче (или даже просто пустой список).

В зависимости от ваших потребностей в обработке, вы можете либо обработать столько столбцов, сколько у вас есть в каждой строке, заменить:

for i in range(csv_cols):

с:

for i in range(len(row)):

Или даже:

for (idx, cell) in enumerate(csv_cols):
    row_cells[idx].text = cell

Или пропустить строки, которые являются пустым списком (но это немного менее надежный, первый также будет иметь дело с неравной длиной строк, если будет возможно достичь этого случая):

for row in csv_reader:

Может читать:

for row in csv_reader:
    if not row: continue  # skip empty row, go to the next one
...