Python "list index out of range" 当我将 csv 转换为 docx 时
Python "list index out of range" when I am converting a csv to docx
我的 csv 每 17 行都有空白行(第 17,34 行中的空白行....)
我试图将其转换为 docx。但是,"list index out of range"错误就出来了。如果我删除 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]
如果您的 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
我的 csv 每 17 行都有空白行(第 17,34 行中的空白行....) 我试图将其转换为 docx。但是,"list index out of range"错误就出来了。如果我删除 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]
如果您的 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