csv.reader 返回一个可迭代对象,因此您应该使用 next(readerx) 而不是 readerx.next
for row in reader:
row1 = next(reader1)
row2 = next(reader2)
row3 = next(reader3)
writer.writerow(row + row1 + row2 + row3)
或者你可以像建议的here那样使用熊猫
除了您将使用pandas.read_csv 和DataFrame.to_csv 来使用CSV 而不是excel 格式。
处理不同大小的表格
上述方法的一个限制是,由于行是单独连接的,如果一个表有不同长度的行,它会弄乱右边的列。其他限制是,如果表有不同的行数,如果任何表短于output1.csv,如果任何表长于output1.csv,则某些行将丢失。下面的代码通过填充空单元格来解决这些限制。这种方法的局限性在于表必须加载到内存中。
def make_uniform_rows(table, numrows, empty=''):
'''
Given a table as a list of lists, produces an output
ensuring that all lists have the same length
filling the empty cells
'''
out = []
ncols = max(len(row) for row in table)
for i in range(table, numrows):
row = table[i] if i < len(table) else []
row += [empty] * (ncols - len(row))
out.append(row);
return out;
def concatenate_tables(readers):
# load everything to memory
tables = [list(reader) for reader in readers];
# determine the number of rows of the bigger csv
numrows = max(len(table) for table in tables)
return make_uniform_rows(tables, numrows)
reader0 = csv.reader(open('output1.csv', 'rb'))
reader1 = csv.reader(open('output2.csv', 'rb'))
reader2 = csv.reader(open('output3.csv', 'rb'))
reader3 = csv.reader(open('output4.csv', 'rb'))
writer = csv.writer(open('appended_output.csv', 'wb'))
for row in concatenated_tables([reader0, reader1, reader2, reader3]):
writer.writerow(row + row1 + row2 + row3)