У меня есть tab separated text file
2 tab separated text file
. Один из них называется major
а другой называется minor
. Это два небольших файла:
major
:
chr1 + 1071396 1271396 LOC
chr12 + 1101483 1121483 MIR200B
minor
:
chr1 1071496 1071536 1
chr1 1071536 1071566 0
chr1 1073566 1073366 1
chr12 1101487 1101516 0
chr12 1101625 1101671 1
Я хочу создать новый файл из этих двух файлов. Фактически, я должен выполнить следующие шаги, чтобы получить окончательный файл:
step1
: разделите разницу между columns 3 and 4
в major
файле на 100
. На этом шаге я делаю новый файл из основного файла, в котором количество строк будет в 100 раз больше, чем количество строк в основном файле. В этом новом файле будет внесено 2 изменения.
1st: columns 3 and 4 will be changed
2nd: I will add a new column called part (in this file that would be part 1 to part 100 per row in major file)
(1071396−1271396)÷100 = 2000 ----> this would be the new difference between columns 3 and 4
chr1 + 1071396 1073396 LOC LOC_part1
chr1 + 1073396 1075396 LOC LOC_part2
.
.
.
chr1 + 1269396 1271396 LOC LOC_part100
chr12 + 1101483 1101683 MIR200B MIR200B_part1
chr12 + 1101683 1101883 MIR200B MIR200B_part2
.
.
.
chr12 + 1121283 1121483 MIR200B MIR200B_part100
Теперь этот новый файл будет играть роль основного файла для следующего шага. Я new_major
это new_major
.
step2
: подсчитайте количество строк в второстепенном файле, которые соответствуют каждой строке в файле new_major, в зависимости от следующих условий:
A) column 1 in minor file == column 1 in new_major
and
B) (column3 of new_major) <= (column2 of minor file) <= (column4 of new_major)
and
C)(column3 of new_major) <= (column3 of minor file) <= (column4 of new_major)
step3
: сделать окончательный файл с tab separated
секцией 7 столбцами. Первые 6 столбцов будут похожи на файл new_major
а `7-й столбец будет считаться с шага 2.
Ожидаемый результат будет следующим:
expected output
:
chr1 + 1071396 1073396 LOC LOC_part1 2
chr1 + 1073396 1075396 LOC LOC_part2 1
.
.
.
chr1 + 1269396 1271396 LOC LOC_part100 0
chr12 + 1101483 1101683 MIR200B MIR200B_part1 2
chr12 + 1101683 1101883 MIR200B MIR200B_part2 0
.
.
.
chr12 + 1121283 1121483 MIR200B MIR200B_part100 0
Я написал следующий код, чтобы получить ожидаемый результат, но он дает ошибку. Ошибка после кода.
major = open('major.txt', 'rb')
minor = open('minor.txt', 'rb')
minor = []
for line in minor:
minor.append(line)
major = []
for line in major:
major.append(line)
new_major = []
for i in major:
percent = (i[3]-i[2])/100
for j in percent:
new_major.append(i[0], i[1], i[2], i[2]+percent, i[4], i[4]_'part'percent[j])
new_major, minor = ([l.split() for l in d.splitlines()] for d in (new_major, minor))
for name_major, sign, low, high, note in major:
parts = list(range(int(low), int(high) + 1, (int(high) - int(low)) // 100))
for part, (low, high) in enumerate(zip(parts, parts[1:]), 1):
count = sum(1 for name_minor, n1, n2, _ in minor if name_major == name_minor and all(low <= int(n) <= high for n in (n1, n2)))
print(' '.join((name_major, sign, str(low), str(high), note, '%s_part%d' % (note, part), str(count))))
Вот ошибка, которую я получил:
>>> for name_major, sign, low, high, note in major:
... parts = list(range(int(low), int(high) + 1, (int(high) -
int(low)) // 100))
... for part, (low, high) in enumerate(zip(parts, parts[1:]), 1):
... count = sum(1 for name_minor, n1, n2, _ in minor if
name_major == name_minor and all(low <= int(n) <= high for n in (n1,
n2)))
... gg = (' '.join((name_major, sign, str(low), str(high),
note, '%s_part%d' % (note, part), str(count))))
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
Вы знаете, как исправить эту проблему?
Всего 1 ответ
Я думаю, вы хотели распаковать new_major
а не major
который является только файловым считывателем в начале файла python.
for name_major, sign, low, high, note in new_major:
Обязательно закройте файл файлом file_object.close()
чтобы освободить ресурсы.