Поскольку вы пометили вопрос с помощью python-3.x
, вот скрипт для достижения того, что вы хотите (хотя для этого требуется Python 3.6+ из-за f-strings
):
from pathlib import Path
import csv
source = Path('input.tsv')
with source.open() as src:
csvreader = csv.reader(src, dialect='excel-tab')
# get number of columns and rewind
cols = len(next(csvreader)[1:])
src.seek(0)
csvwriters = []
# create a csv.writer for each column
for i in range(cols):
# output_col_01.tsv, output_col_02.tsv ...
csvwriters.append(
csv.writer(
Path(f'output_col_{i + 1:02d}.tsv').open('w'),
dialect='excel-tab'
)
)
nan = float('nan')
for name, *cols in csvreader:
for i, a in enumerate(cols):
row = [name]
for j, b in enumerate(cols):
# skip the quotient of a col by itself
if i != j:
a = float(a)
b = float(b)
# nan if division by zero
row.append(round(a / b, 4) if b else nan)
csvwriters[i].writerow(row)
вместо добавив 0.001
для операций, в которых делитель равен 0
, я решил вернуть float('nan')
.
. Он не будет делить столбец сам по себе и округлять частные до 4 десятичных знаков.
Наконец, если вы используете Python версию более раннюю, чем 3.6 (но вам все равно понадобится Python версия 3.4+ из-за pathlib.Path()
), тогда замените следующую строку:
Path(f'output_col_{i + 1:02d}.tsv').open('w'),
с:
Path('output_col_%02d.tsv' % (i + 1)).open('w'),
Это необходимо, потому что f-strings
были введены в Python 3.6.